輸入N個點的座標,判斷這N個點能否構成凸多邊形

2022-03-05 15:10:29 字數 3038 閱讀 5918

1樓:匿名使用者

首先要弄清這n個點是否是連續(順序)的,即1連2, 2連3, 3連4.。。。n連1

如果這n點是隨機(任意次序)的,目前我沒想出很好的辦法,也許對某點可以將相鄰最近的兩點與其連起來?

如果這n個點是連續(順序)的,那麼對於凸多邊形,某頂點臨近的兩頂點的連線必然在多邊形內部,反之則不是凸多邊形。 比如點1連2, 2連3,則1、3連線必在多邊形內部,也即抹去12連線和23連線,連線13,2必在新多邊形外。

如何判斷某點在一個多邊形外或內?通過這一點的一條直線如果穿過多邊形,那麼與多邊形邊界的兩個交點在這點的兩邊的,這點在多邊形內,在同一邊的,這點在多邊形外。

如何找通過某點的直線,此直線穿過多邊形?可以試此點與多邊形各定點的連線,這些連線應該有穿過多邊形的。

定下演算法後,接下去就是高中解析幾何的問題了。(一堆直線方程的計算)

寫了這麼多,希望樓主認真看看,歡迎跟我討論

2樓:言川之

# include

using namespace std;

int main ()

, b[110] = ;

int flag = 1;

for (int i = 1; i <= n; i++)for (int i = 1; i < n; i++)else

}if (t1 == 0 && t2 < 0)else

}if (t1 > 0 && t2 == 0)else

}if (t1 < 0 && t2 == 0)else }}

if (flag == 1)

cin >> n;

}return 0;}

求改這道題::「輸入n個點的座標,判斷這n個點能否構成一個凸多邊形」

3樓:匿名使用者

#define n 4 這裡限定死了

你意思是想通過輸入來確定n值吧

可以通過動態分配記憶體方法來實現

4樓:匿名使用者

#include

#include

#define eps 1e-8

#define zero(x) (((x)>0?(x):-(x))0?1:-1):(ret>0?1:-1);

}void _graham(int n,point* p,int& s,point* ch)

//構造凸包介面函式,傳入原始點集大小n,點集p(p原有順序被打亂!)

//返回凸包大小,凸包的點在convex中

//引數maxsize為1包含共線點,為0不包含共線點,預設為1

//引數clockwise為1順時針構造,為0逆時針構造,預設為1

//在輸入僅有若干共線點時演算法不穩定,可能有此類情況請另行處理!

//不能去掉點集中重合的點

int graham(int n,point* p,point* convex,int maxsize=1,int dir=1)

int main()

k=graham(n,data,ans,1,1);

if(k==n)printf("yes\n");

else printf("no\n");

}//凸包模版應對一切

輸入n個點的座標,由程式判斷該n個點是否能構成一個凸多邊形

輸入n個點的座標,判斷這n個點能否構成一個凸多邊形 5

5樓:匿名使用者

凸多邊形的定義任意一邊無限延長後其餘邊在這一邊的同一側一個二維陣列

存入n個點座標(x,y)

取出一個點記這個點為(x1,y1)與其餘點的x比較記其餘點的x為x2,x1-x1最小為鄰近點 再將這兩個代入直線方程式求出k,b得出方程式為((x1-x2)/(y1-y2))(x-x1)+y1-y=0

將其餘點的x代入若小於0(點在這一邊的下面)設一個值n=-1,若大於0設n=1測試下一個點若下一個點代入後小於0設n1=-1或大於0,n1=1直到n個點接著判斷n與n1,n2的數值相同不的,相同成立則為凸多邊形,不同則不是。可能有點亂,具體演算法自己寫吧我提供思路

建議以後設計程式先看下這個東西的定義

6樓:

求神人寫吧,想不出演算法來。問了下同事,也沒人會寫。

1:怎麼把這個多邊形構造出來?

2:構造出來,怎麼去判斷是不是凸多邊形(任意兩邊之間的夾角<180°)

真心求教神人思考下

7樓:澄凌利

1:怎麼把這個多邊形構造出來?

2:構造出來,怎麼去判斷是不是凸多邊形(任意兩邊之間的夾角<180°)

用 c語言 實現:輸入n個點的座標,判斷這n個點能否構成一個凸多邊形 100

8樓:水寒三尺

以下方法不是最優演算法,如果用c++類來實現,則更佳#include

#define n 4

int tt(double p[2],int a,int b)for(int j=1;j

return 1;

}int real(double p[2])for( i=0;i

flag[m]=1;

for(i=0;i

if(tt(p,0,m)) return 1;

return 0;

}void main()

if (real(p))

ptintf("能");

else

ptintf("不能");

ptintf("\n是否繼續判斷?(繼續請輸入y&y)");

scanf("%d",&ch);}}

輸入n個點的座標,判斷這n個點能否構成一個凸多邊形+c語言網上的都是4個點的

9樓:匿名使用者

求平面點集凸包,判斷是否所有點都在凸包上,時間複雜度o(nlogn)。

需要注意三點一線的情況算不算凸多邊形。

如果不會的話,去學一下二維凸包吧,我就知道這個做法了。

C60程式設計輸入n3n10個數,輸出這n個數中

include stdafx.h define n 5 void min int ip void main min a void min int ip 輸入一個正整數n 1 include include int main void else min a for i 0 i printf 最小數 d...

有三個點座標,在CAD中怎麼輸入座標得出點來

cad的座標由x,y,z軸組成,輸入時需要輸入三個座標值,中間用逗號分開 英文標點符號下輸入 笛卡爾座標系有三個軸,即 x y 和 z 軸。輸入座標值時,需要指示沿 x y 和 z 軸相對於座標系原點 0,0,0 點的距離 以單位表示 及其方向 正或負 在二維中,在 xy 平面 也稱為工作平面 上指...

如何證明n個連續整數的乘積 能被n!整除

哥德 猜想的證明 一 引子 1742年6月7日哥德 寫信給當時的大數學家尤拉,正式提出了以下的猜想 a 任何一個大於 6的偶數都可以表示成兩個素數之和。b 任何一個大於9的奇數都可以表示成三個素數之和。這就是哥德 猜想。哥德 猜想 大於6的偶數可以表示為兩個奇素數之和。這裡大於6的偶數,是指大於或等...