十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
遞歸尋找各個(gè)點(diǎn)最近的點(diǎn),兩點(diǎn)間距離可通過(guò)勾股定理求得。
創(chuàng)新互聯(lián)是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),網(wǎng)絡(luò)空間、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,成都托管服務(wù)器,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國(guó)大陸、港澳臺(tái)以及歐美等多個(gè)國(guó)家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。
兩個(gè)最近的點(diǎn)連成一條直線,
然后判斷各條直線的交點(diǎn)是否為輸入的那些點(diǎn)。
如果交點(diǎn)均在輸入的點(diǎn)處,則是凸多邊形。
只要有任意兩條線的交點(diǎn)不在輸入的點(diǎn)處,就非凸多邊形。但是要排除多點(diǎn)一線的情況。
求兩條線交點(diǎn)可有參數(shù)方程求得。
如下
兩點(diǎn)定一線,
線1,點(diǎn)1(x1,y1) 點(diǎn)2 (x2,y2)
線2,點(diǎn)3(x3,y3) 點(diǎn)4 (x4,y4)
t=[(y4-y3)(x3-x1)-(y3-y1)(x4-x3)] ÷ [(y4-y3)(x2-x1)-(y2-y1)(x4-x3)]
注意不要用整數(shù)計(jì)算,要用浮點(diǎn)數(shù),否則會(huì)得不到準(zhǔn)確的t值
交點(diǎn)處坐標(biāo)為
x = x1+(x2-x1)t
y = y1+(y2-y1)t
簡(jiǎn)單點(diǎn)說(shuō),t=0或者1時(shí),兩線相交于給定點(diǎn),任意其他值,均交與其他點(diǎn)。
原理就是這些了,自己寫(xiě)代碼吧
我測(cè)試過(guò)了,四點(diǎn)一線,凹四邊形,四邊形,有兩個(gè)點(diǎn)共點(diǎn),都可以,這里使用一條知道N邊形N個(gè)頂點(diǎn)坐標(biāo)求N邊形的面積的公式,這些情況其實(shí)已經(jīng)可以不考慮,呵呵,自動(dòng)求
凹四邊形情況:
有三點(diǎn)共一線形成三角形的情況:
#include?"stdio.h"
#include?"math.h"
void?main()
{
double?x[4],y[4];
for(int?i=0;i4;i++)
{
scanf("%lf%lf",x[i],y[i]);
}
double?mianji=0.0;
for(int?ii?=?1?;?ii?4?;?ii++)
{
mianji+=(x[ii-1]*y[ii]-x[ii]*y[ii-1]);
}
mianji+=x[3]*y[0]-x[0]*y[3];
mianji=?fabs(0.5*mianji);
printf("%lf\n",mianji);
}
你可以參考下面的方法:
.判斷一個(gè)封閉圖形是凹集還是凸集
語(yǔ)法:result=convex(Point *p,int n);
參數(shù):
*p: 封閉曲線頂點(diǎn)數(shù)組
n: 封閉曲線頂點(diǎn)個(gè)數(shù)
返回值: 1:凸集;-1:凹集;0:曲線不符合要求無(wú)法計(jì)算
注意:
默認(rèn)曲線為簡(jiǎn)單曲線:無(wú)交叉、無(wú)圈
源程序:
typedef struct {
double x,y;
} Point;
int convex(Point *p,int n)
{
int i,j,k;
int flag = 0;
double z;
if (n 3)
return(0);
for (i=0;in;i++) {
j = (i + 1) % n;
k = (i + 2) % n;
z = (p[j].x - p[i].x) * (p[k].y - p[j].y);
z -= (p[j].y - p[i].y) * (p[k].x - p[j].x);
if (z 0)
flag |= 1;
else if (z 0)
flag |= 2;
if (flag == 3)
return -1; //CONCAVE
}
if (flag != 0)
return 1; //CONVEX
else
return 0;
}