网站建设流程策划方案,网站建设管理员工工资多少,qq空间 同步 wordpress,富海人才招聘网官网考虑一个矩形 ABCD#xff0c;我们给出了边 AD 和 BC 中点#xff08;分别为 p 和 q#xff09;的坐标以及它们的长度 L#xff08;AD BC L#xff09;。现在给定参数#xff0c;我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子#xff1a;
输入#xff1a;p (1,… 考虑一个矩形 ABCD我们给出了边 AD 和 BC 中点分别为 p 和 q的坐标以及它们的长度 LAD BC L。现在给定参数我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子
输入p (1, 0) q (1, 2) L 2
输出00022220
解释
打印的点形成一个矩形
满足输入约束。
输入p (1, 1) q (-1, -1) L 2*sqrt(2)
输出02-200-220
从问题陈述中可能出现 3 种情况
矩形是水平的即 AD 和 BC 平行于 X 轴
矩形是垂直的即 AD 和 BC 平行于 Y 轴
矩形与轴线呈一定角度倾斜 前两种情况很简单使用基本几何学就可以轻松解决。对于第三种情况我们需要应用一些数学概念来找到点。 为了清楚起见请考虑上图。我们有 p 和 q 的坐标。因此我们可以找到 AD 和 BC 的斜率因为 pq 垂直于 AD。一旦我们有了 AD 的斜率我们就可以找到通过 AD 的直线方程。现在我们可以应用距离公式来获得沿 X 轴和 Y 轴的位移。
如果 AD 的斜率 m则 m (px- qx)/(qy- py)
以及沿 X 轴的位移dx L/(2*sqrt(1m*m))
类似地dy m*L/(2*sqrt(1m*m))
现在我们可以通过简单地加减相应获得的位移来找到 4 个角的坐标。
下面是实现过程:
// Javascript program to find corner points of // a rectangle using given length and middle // points. // Structure to represent a co-ordinate point class Point { constructor(a,b) { this.xa; this.yb; } } // This function receives two points and length // of the side of rectangle and prints the 4 // corner points of the rectangle function printCorners(p,q,l) { let a new Point(), b new Point(), c new Point(), d new Point(); // horizontal rectangle if (p.x q.x) { a.x (p.x - (l / 2.0)); a.y p.y; d.x (p.x (l / 2.0)); d.y p.y; b.x (q.x - (l / 2.0)); b.y q.y; c.x (q.x (l / 2.0)); c.y q.y; } // vertical rectangle else if (p.y q.y) { a.y (p.y - (l / 2.0)); a.x p.x; d.y (p.y (l / 2.0)); d.x p.x; b.y (q.y - (l / 2.0)); b.x q.x; c.y (q.y (l / 2.0)); c.x q.x; } // slanted rectangle else { // calculate slope of the side let m (p.x - q.x) / (q.y - p.y); // calculate displacements along axes let dx ((l / Math.sqrt(1 (m * m))) * 0.5); let dy m * dx; a.x p.x - dx; a.y p.y - dy; d.x p.x dx; d.y p.y dy; b.x q.x - dx; b.y q.y - dy; c.x q.x dx; c.y q.y dy; } document.write(a.x , a.y br b.x , b.y br c.x , c.y br d.x , d.y br); } // Driver code let p1 new Point(1, 0), q1 new Point(1, 2); printCorners(p1, q1, 2); let p new Point(1, 1), q new Point(-1, -1); printCorners(p, q, (2 * Math.sqrt(2))); // This code is contributed by rag2127
输出
00 0、2 22 20
0、2 -20 0、-2 20
时间复杂度 O(1)
辅助空间 O(1)