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

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

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

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

那么就开始动手计算吧。

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

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;

		}
	}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115090.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 多进程与多线程区别

    多进程与多线程区别在 Unix 上编程采用多线程还是多进程的争执由来已久 这种争执最常见到在 C S 通讯中服务端并发技术的选型上 比如 WEB 服务器技术中 Apache 是采用多进程的 perfork 模式 每客户连接对应一个进程 每进程中只存在唯一一个执行线程 nbsp Java 的 Web 容器 Tomcat Websphere 等都是多线程的 每客户连接对应一个线程 所有线程都在一个进程中 从 Unix 发展历史看 伴随着 Uni

    2025年8月3日
    0
  • Python GUI[通俗易懂]

    Python GUI[通俗易懂]1.flexxFlexx是一个纯Python工具包,用来创建图形化界面应用程序。其使用Web技术进行界面的渲染。你可以用Flexx来创建桌面应用,同时也可以导出一个应用到独立的HTML文档

    2022年7月5日
    25
  • 解决NVIDIA显卡驱动 图形驱动程序安装失败 问题

    解决NVIDIA显卡驱动 图形驱动程序安装失败 问题本教程是在当你尝试一般的教程都无法解决问题的前提下使用,比如使用DDU工具卸载原显卡驱动后重新安装无效,找不到独立显卡的情况。退出火绒等杀毒软件win+R输入services.msc进入服务。将WindowsUpdata启动类型改为自动,并启动服务。win+R输入gpedit.msc进入本地策略编辑器。在计算机配置-模板管理-系统-设备安装-设备安装限制中双击图中第三个将其改为未配置或禁用重新安装显卡驱动即可…

    2022年5月6日
    842
  • C语言中三目运算符_c语言中的单目运算符

    C语言中三目运算符_c语言中的单目运算符三目运算符三目运算符:也叫三元运算符。这个运算符的符号是:?:语法:表达式1?表达式2:表达式3;语义:先执行表达式1,执行完毕,表达式1的结果如果为真,那么执行表达式2,并且这

    2022年8月2日
    6
  • vdbench测试过程中遇到的小问题[通俗易懂]

    vdbench测试过程中遇到的小问题[通俗易懂]vdbench测试过程中遇到的小问题1.报Slavehd2-0prematurelyterminated错误 首先根据提示查看hd2-0.stdout.html文件获取更多的错误信息,这个问题一般是未安装vdbench或者路径不一致问题…

    2022年5月19日
    163

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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