大家好,又见面了,我是全栈君。
事实上平面中只要确定两个点的坐标,只要这两个点的坐标不重合就能够绘制出等边三角形,并且不仅仅能够绘制出一个而是两个等边三角形。绘制出来的两个等边三角形就好比如菱形一样。
那么就开始动手计算吧。
计算第三个点的坐标的主要流程大概如下所示:
1.给出两个点(检测两个点是否是同一个点);
2.计算边长;
3.判断两种特殊情况,两点构成的线段是否是平行或者垂直于坐标轴(后续使用点斜式计算);
4.计算截距(b)以及斜率(k); y= kx+b;
5.计算出两点的中点坐标,使用斜率k1*k2 = -1的定律进行计算斜率k2;
6.由k2以及一个点计算出垂直的直线的直线公式;
7.后续调用点到中心点的距离以及直线二的公式进行求解出两个x,之后代入直线二的方程进行计算两个y出来;
8.上面的三角形的y大于中心点的y0,下面的三角形就刚好相反;(这里就可以确定三角形的第三个点了)
代码实现如下:
bool dengbian()
{
double xa, ya, xb, yb; // 已知的两点坐标
double FindX1, FindY1, FindX2, FindY2; // 求出的等边三角形的第三个点的坐标 , 一般都会有两个喔
// 两点重合
if (fabs(xa - xb) < 0.001 && fabs(ya - yb) < 0.001)
{
return false;
}
else {
// 首先把公用的数据计算出来(边长、中点坐标)
double sideLength1 = (xa - xb);
double sideLength2 = (ya - yb);
double sideLength = sqrt(sideLength1*sideLength1 + sideLength2 * sideLength2);
double tempX, tempY; // 中点坐标
tempX = (xa + xb) / 2;
tempY = (ya + yb) / 2;
if (fabs(xa - xb) < 0.001) // 垂直的情况下
{
FindY1 = tempY;
FindY2 = tempY;
double temp_len = sqrt(3.0) / 2 * sideLength;
FindX1 = tempX + temp_len;
FindX2 = tempX - temp_len;
return true;
}
else if (fabs(ya - yb) < 0.001) // 平行的情况下
{
FindX1 = tempX;
FindX2 = tempX;
double temp_len = sqrt(3.0) / 2 * sideLength;
FindY1 = tempY + temp_len;
FindY2 = tempY - temp_len;
return true;
}
else {
double k, k1; // 斜率
double b, b1; // 截距
k = (yb - ya) / (xb - xa);
b = ya - k * xa;
k1 = -1 / k;
b1 = tempY - k1 * tempX; // 到这里为止,两条直线公式已经求出来了
// 根据求根公式进行求解
double db;
db = 2 * k1*(b1 - tempY) - 2 * tempX;
double da;
da = k1 * k1 + 1;
double dc;
dc = tempX * tempX + (b1 - tempY)*(b1 - tempY) - (3.0 / 4) * sideLength * sideLength;
double dx; // sqrt(b*b - 4*a*c)
dx = db * db - 4 * da * dc; // 这个应该是没有开方之前在进行
if (dx < 0)
{
// 不能够构成等边三角形
return false;
}
dx = sqrt(db*db - 4 * da * dc); // 开方
double x1, x2, y1, y2;
x1 = ((-db + dx) / (2 * da));
x2 = ((-db - dx) / (2 * da));
y1 = x1 * k1 + b1;
y2 = x2 * k1 + b1;
// 判断哪个点的坐标是上等边三角形,哪个点的坐标是下等边三角形
// 上等边三角形的第三个点的坐标的Y轴坐标必定大于中点的Y轴的坐标,以其为判断标准即可判断出
if (y1 > tempY)
{
FindX1 = x1;
FindY1 = y1;
FindX2 = x2;
FindY2 = x2;
}
else {
FindX1 = x2;
FindY1 = y2;
FindX2 = x1;
FindY2 = y1;
}
return true;
}
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115090.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...