基本思路是使用余弦定理
cos B = (a^2 + c^2 -b^2) / (2*a*c)
首先可以算出三条边的长度,如果有两个之和等于第三个,那么就是三点共线,不是三角形。其他情况就是三角形了,调用余弦定理一个一个算就行了。
下面是代码
#include <stdio.h>
#include <math.h>
#define PI 3.14159265354
void main(void)
{
double a[3][2] /*用来保存三个点的横纵坐标*/
double len[3],b[3],c[2]
int i , n
for(i = 0 i<3i++)
scanf("%lf %lf",&a[i][0],&a[i][1])
len[0] = sqrt( pow(a[0][0]-a[1][0],2)+pow(a[0][1]-a[1][1],2) ) /*AB */
len[1] = sqrt( pow(a[2][0]-a[1][0],2)+pow(a[2][1]-a[1][1],2) ) /*BC */
len[2] = sqrt( pow(a[0][0]-a[2][0],2)+pow(a[0][1]-a[2][1],2) ) /*AC */
printf("边AB = %f\t边BC = %f\t边AC = %f\n",len[0],len[1],len[2])
b[0] = (pow(len[0],2) + pow(len[1],2) - pow(len[2],2)) / ( 2.0 *len[0]*len[1])
if(b[0] == 0)
printf("角B = %f\n",b[0] = 90.0)
else
{
b[0] = atan(sqrt(1-pow(b[0],2))/b[0])
b[0] = 180*b[0]/PI
printf("角B = %f\n",b[0])
}
b[1] = (pow(len[2],2) + pow(len[1],2) - pow(len[0],2)) / ( 2.0 *len[2]*len[1])
if(b[1]==0)
printf("角C = %f\n",b[1] = 90.0)
else
{
b[1] = atan(sqrt(1-pow(b[1],2))/b[1])
b[1] = 180*b[1]/PI
printf("角C = %f\n",b[1])
}
b[2] = 180 - b[0] - b[1]
printf("角A = %f\n",b[2])
}
用向量吧。假设你知道多边形各点的输入顺序。假设这个多边形有5个点 A( a1, a2, a3),B( b1, b2, b3),C( c1, c2, c3),D( d1, d2, d3),E( e1, e2, e3).
向量BA = ( b1 - a1, b2 - a2, b3 - a3). 将BA转化成标准向量 NBA = Normalize( BA)
向量BC = ( b1 - c1, b2 - c2, b3 - c3). 将BC转化成标准向量 NBC = Normalize( BC)
然后内角角度就为 arccos( NBA 点乘 NBC)