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

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

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

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

那么就开始动手计算吧。

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

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安装windows系统_deepin安装wine

    linux安装windows系统_deepin安装wine一、安装1.参考网站:https://www.jianshu.com/p/809c0de6fc31https://github.com/askme765cs/Wine-QQ-TIM2.步骤:先下载WineQQ压缩包:wineQQ9.0.3_23729.tar.xz$sudoadd-apt-repositoryppa:wine/wine-builds$sudoapt-get…

    2022年9月6日
    2
  • Python中的XOR异或符号^运用

    Python中的XOR异或符号^运用^运算符为异或运算a=10b=100c=a^b#c=110为什么会得到这样的结果呢?bin(10)#’0b1010’bin(100)#’0b1100100’其实这里面经历了几次计算:1.计算a,b的二进制值:bin(10)#’0b1010’bin(100)#’0b1100100’2.^符号的作用是将两数字相…

    2022年7月16日
    14
  • 盘点五款好用的项目管理软件

    盘点五款好用的项目管理软件好用的项目管理软件有哪些?对于很多从事项目开发与设计的团队都会有这样的需求,一款优秀的项目进度管理软件在企业项目实施中有着极为重要的作用,它伴随着项目计划、定义、监控、控制以及确认交付的全部过程。那么面对市场上众多的企业项目进度管理软件,有哪些项目管理软件比较好呢?本文将盘点分析市面上常见几款甘特图软件,以帮助大家能够找到适合自己的工具。|EdrawProject这是一款专业的项目管…

    2022年5月29日
    46
  • 有趣的python代码_python五角星代码

    有趣的python代码_python五角星代码原标题:使用Python代码的程序员也浪漫代码也浪漫:用Python放一场圣诞节烟花秀!天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花庆祝昨晚法国队夺冠,工作之余也可以随时让程序为自己放一场烟花秀。这个有趣的小项目并不复杂,只需一点可视化技巧,100余行Python代码和程序库Tkinter,最后我们就能达到下面这个效果:学完本教程后,你也能做…

    2022年9月24日
    0
  • Java集合篇:HashMap原理详解(JDK1.8)

    Java集合篇:HashMap原理详解(JDK1.8)

    2021年10月4日
    214
  • microsoft silverlight

    microsoft silverlightMicrosoftSilverlight是一个跨浏览器的、跨平台的插件,为网络带来下一代基于.NETFramework的媒体体验和丰富的交互式应用程序。Silverlight提供灵活的编程模型,并可以很方便地集成到现有的网络应用程序中。Silverlight可以对运行在Mac或Windows上的主流浏览器提供高质量视频信息的快速、低成本的传递。MicrosoftSilverlight的

    2022年10月18日
    0

发表回复

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

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