【发布时间】:2014-08-05 05:43:46
【问题描述】:
我有一个任意的凸多边形。它被两条垂直线分割(它们的向量是(0,1)和(1,0))。是否有任何算法可以通过较小的数字(S1、S2、S3、S4)计算面积。我所能做的就是计算线穿过多边形的点,然后计算面积,但有没有更好的优化?
我将所有顶点存储在数组double **v;
然后我计算所有点,我的多边形穿过 X 和 Y 轴:
void cross() { //calculates buf (crossing with Y)
act = 0;
for (int i = 0; i < n; ++i) {
buf[act][0]=v[i][0];
buf[act][1]=v[i][1];
act++;
if (v[i][0]*v[(i+1)%n][0] < 0) {
buf[act][0] = 0;
buf[act][1] = v[i][1] + std::abs(v[i][0])*(v[(i+1)%n][1]-v[i][1])/(std::abs(v[i][0])+std::abs(v[(i+1)%n][0]));
act++;
}
}
}
void vert() { /calculates buf2 (crossing with X)
act2 =0;
for (int i = 0; i < act; ++i) {
buf2[act2][0]=buf[i][0];
buf2[act2][1]=buf[i][1];
act2++;
if (buf[i][1]*buf[(i+1)%act][1] < 0) {
buf2[act2][1] = 0;
buf2[act2][0] = buf[i][0] + std::abs(buf[i][1])*(buf[(i+1)%act][0] - buf[i][0])/ (std::abs(buf[i][1])+std::abs(buf[(i+1)%act][1]));
act2++;
}
}
}
调用cross()后;顶点();我得到一个数组 buf2 和 act2 的元素数量; 在此之后,我正在对多边形进行三角剖分并检测在什么小队中进行了训练。
double s_trian (double a, double b, double c, double d) {
//area of triangle
double s =0;
s=0.5*std::abs((a)*(d)-(c)*(b));
return s;
}
void triang() { //calculate areas of s1,s2,s3,s4 by
//triangulating
bool rotation;
double temror;
s1=0, s2 =0, s3 =0, s4 =0;
int a,b;
for (int i =0; i < act2; ++i) {
a=i%act2;
b=(i+1)%act2;
temror = s_trian(buf2[a][0], buf2[a][1], buf2[b][0], buf2[b][1]);
if ((buf2[a][0]+buf2[b][0]) > 0) {
if((buf2[a][1]+buf2[b][1] > 0))
s1+=temror;
else
s4+=temror;
} else {
if ((buf2[a][1]+buf2[b][1] > 0))
s2+=temror;
else
s3+=temror;
}
}
}
我可以在这里优化一些东西吗?
【问题讨论】:
-
我不知道你怎么能做得更好,尽管如果你有三个较小数字的面积和整体,你可以取不同的面积来获得最后一个象限的面积。
-
实际上,再想一想 - 如果所有三角形都由边和原点组成,那么计算面积如何?在边与轴相交的地方,计算两个部分并分配给右侧四边形。
-
这个问题比较适合math.stackexchange.com