程式設計之美 第四章 數字之趣 4 4點是否在三角形內

2021-07-04 06:32:52 字數 2239 閱讀 2789

/*

點是否在三角形內:

如果乙個二維座標系中,已知三角形頂點的座標,那麼對於座標系中的任意一點,如何判斷該點是否在三角形內(點在三角形邊線上也可)?

假設三角形頂點的座標為abc(逆時針),需要判斷點d是否在該三角形內。

分析:利用垂涎的交點可以判斷。如果點d在三角形內,所有的垂線交點都在三角形的邊線之內。如果點d在三角形之外,則垂線的交點就會在三角形邊線的延長線上。

但是鈍角三角形是不可取的,此方法錯誤。

解法1:

研究點與線段之間的關係,考慮把點d和其他的三個點連線起來。將問題轉化為比較三角形abc的面積 與 三角形abd bcd cad的面積之和

如果sabc = sabd + sbcd + scad,那麼點d在三角形abc的內部或者邊上,如果 sabc < sabd + sbcd + scad ,則點d在三角形外部。

計算三角形面積用海**式

計算出三邊的邊長分別為a,b,c,

p = (a + b + c)/2;

s = 根號下(p-a)*(p-b)*(p-c)*p

解法2:

因為三角形是凸的,所以如果有乙個d在三角形abc內,那麼沿著三角形的邊界逆時針走,點d一定保持在邊界的左邊,也就是說點d在邊ab,bc,ca的左邊。

判斷乙個點p3是否在射線p1,p2的左邊,可以通過p1p2,p1p3兩個向量叉積的正負判斷

如果叉積為正,則p3在p1p2的左邊

負, 右

0, 射線上

輸入:3 2(輸入測試點的座標)

1 1(輸入三角形三個頂點的座標)

5 13 3

2 31 1

5 13 3

輸出:yes

no*/

/*關鍵:

1 if(dsabd + dsbcd + dscda > dsabc)//如果三個小三角形的面積大於原三角形面積,那麼說明測試點不再原三角形內

2 return sqrt( (dp - da) * (dp - db) * (dp - dc) * dp);//計算面積採用海**式,計算出三邊的邊長分別為a,b,c,p = (a + b + c)/2;s = 根號下(p-a)*(p-b)*(p-c)*p

3 bool isinrectangle_vector(const point& testpoint,point* recpoint)//通過向量來判斷測試點是否在另外兩點所形成射線的左邊,需要計算

//bd*bc >0 ,cd * ca > 0,ad * ab > 0

4 doublet dret = (point2._ix - point3._ix) * (point1._ix - point3._ix) + (point2._iy - point3._iy) * (point1._iy - point3._iy);

//我們以第三個點為主點,判斷乙個點p3是否在射線p1,p2的左邊,可以通過p1p2,p1p3兩個向量叉積的正負判斷,如果叉積為正,則p3在p1p2的左邊 */

#include #include typedef float doublet;

typedef struct point

point;

doublet distance(const point& point1,const point& point2)

doublet area(const point& point1,const point& point2,const point& point3)

bool isinrectangle(const point& testpoint,point* recpoint)

else }

bool product(const point& point1,const point& point2,const point& point3)

bool isinrectangle_vector(const point& testpoint,point* recpoint)//通過向量來判斷測試點是否在另外兩點所形成射線的左邊,需要計算

//bd*bc >0 ,cd * ca > 0,ad * ab > 0

void process()

//if(isinrectangle(testpoint,rectanglepoint))

if(isinrectangle_vector(testpoint,rectanglepoint))

else

}}int main(int argc,char* argv)

程式設計之美 第四章 數字之趣 4 10數字啞謎和回文

數字啞謎和回文 1神奇的9位數。能不能找出符合如下條件的9位數 這個數包括了1 9這9個數字 這個9位數的前n位都能被n整除,若這個數表示為abcdefghi,則ab可以被2整除,abc可以被3整除.abcdefghi可以被9整除 2有這樣乙個乘法算式 人過大佛寺 我 寺佛大過人 這裡面每乙個字都代...

程式設計之美 第四章 數字之趣 4 2瓷磚覆蓋地板

瓷磚覆蓋地板 原來的地板鋪有n m塊正方形瓷磚,商店只提供長方形瓷磚,現在一塊長方形瓷磚相當於於原來的兩塊正方形瓷磚,能否用1 2的瓷磚去覆蓋n m的地板呢 本質 斐波那契遞推數列公式 f i f i 1 f i 2 分析 n m的地板有以下幾種可能 1如果n 1,m為偶數的話,顯然1 2的瓷磚可以...

《數學之美》 第四章 個人筆記

數學之美 最近在讀 數學之美 這本書,做一下個人筆記。看的是pdf,看完後會買一本的哦!版權意識還是有的。1 中文分詞方法的演變 最早的方法 北航 查字典,可以解決七八成問題,成本不高,效果還行。隨後 哈工大 最少詞數的分詞理論,即一句話應該分詞數量最少的詞串。不足之處在於二義性。郭進 清華 統計語...