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

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

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

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

那么就开始动手计算吧。

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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux下的文本编辑器vi

    Linux下的文本编辑器vi在终端中打开输入vi[文件],启动vi。vi有三种工作模式:命令模式、文本编辑模式、最后行模式。命令模式是启动vi进入的工作模式,在此模式下输入i,I,a,A,o,O,r,R命令中的任何一个即可进入文本编辑模式。此时在状态/命令区出现“—INSERT—”字样。在文本编辑模式下可输入文本内容,用上、下、左、右方向键移动光标,使用【Del】键和【Backspace】键删除字符,按【Esc】键回到…

    2022年7月26日
    5
  • java中scanner意思_java中Scanner s = new Scanner(System.in);分别是什么意思?「建议收藏」

    java中scanner意思_java中Scanner s = new Scanner(System.in);分别是什么意思?「建议收藏」展开全部Scanner是一个类,nextDouble()是Scanner的成员函数,System.in作为参数传递给Scanner的构造函数,使Scanner用62616964757a686964616fe78988e69d8331333366303839键盘作为输入,然后用new在内存中实例化一个Scanner出来,使得其它变量能调用这块内存区。Scanner类简介:Java5添加了java….

    2022年7月20日
    14
  • 3运放差分放大电路_集成运放差分放大电路

    3运放差分放大电路_集成运放差分放大电路三运放差分放大电路三运放差分放大电路时间:2009-07-2621:23:25来源:资料室作者:三运放差分电路如图所示的同相并联三运放结构,这种结构可以较好地满足上面三条要求。放大器的第I级主要用来提高整个放大电路的输入阻抗。第II级采用差动电路用以提高共模抑制比。图三运放差分放大电路电路中输入级由A3、A4两个同相输入运算放大器电路并联,再与A5差分输入串联的三运放差动放大电…

    2022年10月24日
    1
  • serdes接口速率_通用串行接口

    serdes接口速率_通用串行接口在以往的IC之间的源同步当中,发送的信号包括数据流信号,以及随着数据流信号同步的时钟信号,时钟信号在低速传输的情况下:1G以下传输,外部的扰动以及时钟抖动不会太影响数据流的恢复,但是如果时钟信号突破了1G甚至更高的情况下,外界环境中比如EMI的各种影响会引起时钟发生抖动,在高速采样恢复的过程中,这就没办法使用该时钟信号恢复数据,这里就用到了高速Serdes串行接口的恢复办法,将数据和时钟都通过高速线上传输,然后接受端通过PLL从数据流中恢复时钟,即使在传输的线上有轻微抖动,但是时钟和数据同时…

    2025年6月17日
    0
  • 如何解决虚拟机连不上网「建议收藏」

    如何解决虚拟机连不上网「建议收藏」通常情况下,电脑关机或重启后需要重新连网,但是,虚拟机下的乌班图通常需要重新连网,很多时候找不到之前连接的网络,如果是宽带连接,首先查看虚拟机的设置,将网络适配器改成Net模式(必要时需要重置,然后重启虚拟机),如果还没有出现要连接的以太网,那么就要查看一下主机的服务中的虚拟机是否已经全部开启,如果没有开启,就要将所有和虚拟机有关的服务启动。…

    2022年6月26日
    29
  • 微信公众号网页授权登录[通俗易懂]

    微信公众号网页授权登录[通俗易懂]微信公众号网页授权登录:前端时间做了一个微信公众号的项目,就是微信公众号的菜单点击我的个人中心,就向用户授权登录获取用户的信息,进行业务逻辑的操作,微信公众号官方文档,这是我写的文章,里面有很多微信的官方文档,希望对大家有用:https://blog.csdn.net/qq_41971087/article/details/82466647在微信公众号官方文档中,看到微信页面开发,…

    2022年6月5日
    35

发表回复

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

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