js 切割三角形

2021-10-05 20:34:20 字數 3488 閱讀 5464

前面我說過怎麼切割圓形

三角形的切割就是每一條邊(注意是線段)與另乙個線段的交點的問題

我們把三角形的每一條邊看成乙個向量,切割的線段也是乙個向量,這樣就是兩個向量求交點問題

現有向量ab 與向量cd 相交於p點

設a(x1,y1) , b(x2, y2),c(x3,y3) , d(x4, y4) ,p(x,y)

因為向量cp // 向量dp ,向量ap // 向量bp

向量cp = ( x - x3 ,y - y3 )

向量dp = ( x - x4 ,y - y4 )

所以 (x - x3)(y - y4) - (y - y3)(x - x4) = 0

x(y3 - y4) + y(x4 - x3) = x4y3 - x3y4

至此方程1出來了,下面求出方程2

向量ap = ( x - x1 ,y - y1 )

向量bp = ( x - x2 ,y - y2 )

(x - x1)(y - y2) - (y - y1)(x - x2) = 0

x(y1 - y2) + y(x2 - x1) = x2y1 - x1y2

兩個方程組成方程組

x(y3 - y4) + y(x4 - x3) = x4y3 - x3y4

x(y1 - y2) + y(x2 - x1) = x2y1 - x1y2

用行列式求解

需要判斷d不能等於0

這樣就求出交點

但是有這種情況

線段沒有相交,但是用向量計算時還是會計算出交點,此時可以用cp+ pd = cd 並且

ap + pb = ab來排除這個點

class ********shape extends shape 

reset(ctx)

drawself(ctx)

drawtext(text, x, y)

ontouchup(event, ctx)

const points = this.getpoint();

if (points && points.length === 2) ;

const b = ;

const c = ;

const left = math.min(math.min(a.x, b.x), c.x);

const top = math.min(math.min(a.y, b.y), c.y);

const right = math.max(math.max(a.x, b.x), c.x);

const bottom = math.max(math.max(a.y, b.y), c.y);

const images = this.cutshape(p1, p2);

this.child.push(new childshape(left, top, right - left, bottom - top, images[0]));

this.child.push(new childshape(left, top, right - left, bottom - top, images[1]));

this.drawchild(ctx);

} else

}cutshape(p1, p2) ;

const b = ;

const c = ;

return utils.to********dataurl(a, b, c, p1, p2, this.fillcolor, this.cutfillcolor, this.strokecolor, this.strokewidth);

}getpoint() ;

const m = ;

const a = ;

const b = ;

const c = ;

const array = ;

const point1 = this.crosspoint(a, b, p, m);

if (point1)

const point2 = this.crosspoint(b, c, p, m);

if (point2)

const point3 = this.crosspoint(c, a, p, m);

if (point3)

return array;

}crosspoint(a, b, p, m)

const d1 = (b.x * a.y - a.x * b.y) * (m.x - p.x) - (b.x - a.x) * (m.x * p.y - p.x * m.y);

const d2 = (a.y - b.y) * (m.x * p.y - p.x * m.y) - (p.y - m.y) * (b.x * a.y - a.x * b.y);

const point = ;

if (math.sqrt(math.pow(point.x - a.x, 2) + math.pow(point.y - a.y, 2)) + math.sqrt(math.pow(point.x - b.x, 2) + math.pow(point.y - b.y, 2)) > math.sqrt(math.pow(b.x - a.x, 2) + math.pow(b.y - a.y, 2)) ||

math.sqrt(math.pow(point.x - p.x, 2) + math.pow(point.y - p.y, 2)) + math.sqrt(math.pow(point.x - m.x, 2) + math.pow(point.y - m.y, 2)) > math.sqrt(math.pow(p.x - m.x, 2) + math.pow(p.y - m.y, 2)))

return point;}}

dem

求大三角形中三角形個數

一道筆試程式設計題要求求乙個大三角形中所有小三角形的個數,大約是下面這種情況 首先想到是的將問題由求邊長為n的三角形個數 求邊長為n 1的三角形個數 求邊長為1的三角形個數 1,回溯求得所有三角形個數。但是再仔細一看因為有重疊三角形和倒置的三角形,所以這個方法不可行。接著找到三角形個數由三部分組成 ...

經典演算法 (三)帕斯卡三角形(楊輝三角形)

楊輝三角,是二項式係數在三角形中的一種幾何排列。在歐洲,這個表叫做帕斯卡三角形。帕斯卡 1623 1662 是在1654年發現這一規律的,比楊輝要遲393年,比賈憲遲600年。簡介 楊輝三角,是二項式係數在三角形中的一種幾何排列。在歐洲,這個表叫做帕斯卡三角形。帕斯卡 1623 1662 是在165...

三角形面積

算是自己第一道正式寫的演算法幾何吧,先從簡單的開始吧,加油!描述 給你三個點,表示乙個三角形的三個頂點,現你的任務是求出該三角形的面積 輸入 每行是一組測試資料,有6個整數x1,y1,x2,y2,x3,y3分別表示三個點的橫縱座標。座標值都在0到10000之間 輸入0 0 0 0 0 0表示輸入結束...