前言
剛好最近在學(xué)processing,然后有不少同學(xué)遇到一個(gè)問(wèn)題哈,就是如何用processing判斷一個(gè)點(diǎn)是否在三角形、圓、橢圓、矩形內(nèi),并且聯(lián)合arduino一起,通過(guò)串口通信實(shí)現(xiàn)用戶在processing發(fā)生點(diǎn)擊事件,然后通過(guò)arduino開(kāi)發(fā)板反饋(亮燈等等),這一期我就先出如何解決利用processing判斷一個(gè)點(diǎn)是否在三角形、圓、橢圓、矩形內(nèi)的問(wèn)題,下一期再聯(lián)合arduino開(kāi)發(fā)板出一期實(shí)現(xiàn)兩個(gè)聯(lián)合,點(diǎn)個(gè)贊支持一下唄!
這一期主要講如何判斷在圓和三角形內(nèi)
下一期主要講如何判斷是在橢圓和矩形內(nèi)
橢圓和矩形看這里
最新一期:直接上processing+Arduino代碼,實(shí)現(xiàn)軟硬件結(jié)合:
如何判斷點(diǎn)擊事件在圓內(nèi):
其實(shí)不用想這么復(fù)雜,我們?cè)诟咧芯蛯W(xué)過(guò)圓的表達(dá)式:(x-a)2+ (y-b)2=r2,在processing中我們用于畫(huà)圓的函數(shù)是
ellipse(a,b,r,r);
根據(jù)這個(gè)函數(shù),我們畫(huà)的時(shí)候就已經(jīng)可以知道了圓心(a,b)、半徑r,我們又知道計(jì)算兩點(diǎn)之間距離的公式:,由這公式我們就知道如果點(diǎn)擊點(diǎn)p與圓心距離大于半徑,那么點(diǎn)p一定在圓外,如果是等于或者小于,就一定是在圓上或圓內(nèi),那么我就可以直接做了
另外在processing中鼠標(biāo)點(diǎn)擊產(chǎn)生的事件會(huì)返回給程序一個(gè)坐標(biāo)即:(mouseX,mouseY),每一次點(diǎn)擊都會(huì)有返回,甚至如果(mouseX,mouseY)在draw()函數(shù)內(nèi)調(diào)用的話還可以實(shí)現(xiàn)一直返回,從而實(shí)現(xiàn)一些跟著鼠標(biāo)不斷畫(huà)圖形、移動(dòng)圖形等根據(jù)這些我們就可以編寫(xiě)以下代碼啦:
上processing代碼:
void setup(){
size(150,50);
}
void draw() {
fill(0,0,255);
ellipse(125,25,50,50);
}
void mouseClicked(){
if(sqrt(sq(mouseX-125)+sq(mouseY-25)) <= 25){
println("yuan");
}
}
運(yùn)行效果:
?上述函數(shù)說(shuō)明:
sq(a)//a的平方
sqrt(b)//開(kāi)b的平方根
/*int a=4;
sq(a)就等于16
sqrt(a)==2
*/
如何判斷點(diǎn)擊事件在三角形內(nèi):(重點(diǎn)、難點(diǎn))
先簡(jiǎn)單說(shuō)一下,其實(shí)辦法很多如用向量相交求交點(diǎn)、算面積等等,后面再考慮出一篇數(shù)學(xué)專(zhuān)題說(shuō)這個(gè),這里為了方便大家理解我就用最容易理解的算三角形面積來(lái)做,顯然底乘高不太現(xiàn)實(shí)比較復(fù)雜,那么還有其他方法嗎?大家應(yīng)該還記得高中學(xué)過(guò)的海倫公式,表達(dá)式為:S=,其中,再結(jié)合兩點(diǎn)之間的距離公式就可以計(jì)算了,那么我們都知道processing畫(huà)一個(gè)三角形的函數(shù)是:
triangle(a1,a2,b1,b2,c1,c2);
其中三個(gè)頂點(diǎn)坐標(biāo)a(a1,a2),b(b1,b2),c(c1,c2),那么如何實(shí)現(xiàn)?請(qǐng)看下圖
當(dāng)正好點(diǎn)擊在圓內(nèi):
圖一:
圖二:
當(dāng)鼠標(biāo)點(diǎn)擊點(diǎn)在三角形內(nèi):
圖一: S=s1+s2+s3,
注意:如果點(diǎn)在三角形的邊上也是可以的,只是其中一個(gè)面積變?yōu)?,和不變?nèi)鐖D二:
S=s1+s2,s3等于0
當(dāng)點(diǎn)擊不在圓內(nèi):
圖三:
?由圖三:S肯定小于s1+s2+s3,其中由圖:(s1+s2+s3)-S=2*s3
圖示
由這兩圖我們可以直觀知道,如果一個(gè)點(diǎn)在這個(gè)三角形內(nèi),那么它與其他三個(gè)頂點(diǎn)相連分別構(gòu)成的三個(gè)三角形的面積之和一定等于大三角形的面積,如果這個(gè)點(diǎn)不在此三角形中,那么其面積之和一定大于原三角形的面積
為了方便這里我們直接用等腰三角形做,其他三角形也是一樣的喔,只是計(jì)算三角形面積稍微改一下就好,直接上代碼processing:
void setup(){
size(150,50);
}
void draw() {
fill(0,255,0);//(R,G,B)綠色
triangle(75,0,50,50,100,50);
}
void mouseClicked(){
if((mouseX>=50)&(mouseX<=100)&(mouseY>=0)&(mouseY<=50)){
float a = sqrt(sq(mouseX-50)+sq(mouseY-50));
float b = sqrt(sq(mouseX-75)+sq(mouseY-0));
float c = sqrt(sq(mouseX-100)+sq(mouseY-50));
float d = sqrt(sq(75-50)+sq(0-50));
float p1 = (a+b+d)/2;
float p2 = (a+c+50)/2;
float p3 = (c+b+d)/2;
float s = sqrt(p1*(p1-a)*(p1-b)*(p1-d))+sqrt(p2*(p2-a)*(p2-c)*(p2-50))+sqrt(p3*(p3-c)*(p3-b)*(p3-d));
if (s>=50*50/2-10 & s<=50*50/2+10){//+10和-10是為了減小誤差,因?yàn)橛?jì)算過(guò)程有較多小數(shù)
println("sanjiaoxing");
}
}
}
代碼函數(shù)說(shuō)明:
a,b,c;分別是鼠標(biāo)到三個(gè)頂點(diǎn)的距離
d;是等腰三角形的腰長(zhǎng)
p1,p2,p3;分別是三個(gè)頂點(diǎn)如鼠標(biāo)點(diǎn)擊點(diǎn)構(gòu)成三角形的p(海倫公式里的p)
s;就是三個(gè)三個(gè)頂點(diǎn)如鼠標(biāo)點(diǎn)擊點(diǎn)構(gòu)成三角形的面積和,可以看出是由三部分加起來(lái)的,其中每一部分都是海倫公式計(jì)算出來(lái)的;
運(yùn)行效果:
如何判斷點(diǎn)擊事件在橢圓內(nèi):(重點(diǎn))???????
廢話不多說(shuō),我們都知道橢圓表達(dá)式:(焦點(diǎn)在x軸)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-409079.html
今天有寫(xiě)代碼有畫(huà)圖還打這么多字實(shí)在是花了好久,點(diǎn)個(gè)贊支持一下吧,剩下的會(huì)在下一篇盡快更噢,請(qǐng)留意,可以進(jìn)我的博客主頁(yè)的processing-arduino專(zhuān)欄查看噢?。?!感謝各位的理解與支持!?。?span toymoban-style="hidden">文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-409079.html
到了這里,關(guān)于processing判斷一個(gè)點(diǎn)是否在三角形、圓、橢圓、矩形內(nèi)(超詳細(xì)鼠標(biāo)交互)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!