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

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

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

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

那么就开始动手计算吧。

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

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


相关推荐

  • kotlin的Map集合

    kotlin的Map集合kotlin的Map集合只读Map可变的MapmutableMapOfkotlin的Map分为:只读Map。可变的MutableMap(MutableMap、HashMap、LinkedHashMap)。只读Map意味着我们创建出来的map是不可变的,即我们只能使用无法改变我们map中的数据,我们只能获取集合中的数据而无法对集合中的数据进行新增和修改。/***…

    2022年5月18日
    36
  • java如何实现分页查询_java分页计算页数

    java如何实现分页查询_java分页计算页数思路,假设数据库里的某张表的数据的条数是185条,我要实现的是一页显示10条,也就是说,展示完所有的数据需要19页,每一页的号是,1-10;11-20,22-31;第一页是a,a+9,第二页就是(a+9)+1,((a+9)+1)+9….一直到(b+9)&gt;185;packagecn.com.servlet;importjava.io.IOException;import…

    2022年9月27日
    3
  • [哎]关于ftp扫描工具的激活成功教程问题[通俗易懂]

    [哎]关于ftp扫描工具的激活成功教程问题[通俗易懂]先前发布过一个工具,用于ftp弱口令扫描 文章地址:http://blog.csdn.net/prsniper/article/details/6101770 当时为了吸引一些反汇编方面的高手交流,故意把DLL使用期限限制在2010年,可惜没人鸟我~~~~~~~~~

    2022年10月1日
    4
  • 19年对口计算机一分一档,2019年河北省单招各考试类一分一档表

    19年对口计算机一分一档,2019年河北省单招各考试类一分一档表原标题:2019年河北省单招各考试类一分一档表2019年河北省单招各考试类一分一档表2019年河北省高职单招考试二类一分一档表http://www.hbdzxx.com/news/2019/4885.html2019年河北省高职单招考试七类和对口医学类一分一档表http://www.hbdzxx.com/news/2019/4887.html2019年河北省高职单招考试九类和对口财经类一分一档表h…

    2022年7月13日
    19
  • HTML5播放暂停音乐

    查看效果:http://hovertree.com/code/jquery/ueyf7gn4.htm代码如下:更多特效:http://www.cnblogs.com/roucheng/p/texi

    2021年12月22日
    47
  • vue服务器端渲染(SSR)实战

    vue服务器端渲染(SSR)实战

    2021年6月7日
    122

发表回复

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

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