已知等边三角形两点坐标,计算第三点坐标

已知等边三角形两点坐标,计算第三点坐标

大家好,又见面了,我是全栈君。

事实上平面中只要确定两个点的坐标,只要这两个点的坐标不重合就能够绘制出等边三角形,并且不仅仅能够绘制出一个而是两个等边三角形。绘制出来的两个等边三角形就好比如菱形一样。

那么就开始动手计算吧。

计算第三个点的坐标的主要流程大概如下所示:

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账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号