如何编写一个C程序来检查一个点是否位于一个正方形内,给定一个对角线的端点

我正在解决上面提到的问题但是对数学方程和变量太过困惑了。 我开始尝试找到另外两个点的坐标,但是方程式无法由我解决,存在很多变量,我感到困惑。 如果这已经完成,我会尝试检查关于两侧的点的位置,但这也包括很多变量和混乱。 一个好的算法可能会有所帮助。 谢谢!

您可以找到两个剩余的正方形点:

x1 = ? ; y1 = ? ; // First diagonal point x2 = ? ; y2 = ? ; // Second diagonal point xc = (x1 + x2)/2 ; yc = (y1 + y2)/2 ; // Center point xd = (x1 - x2)/2 ; yd = (y1 - y2)/2 ; // Half-diagonal x3 = xc - yd ; y3 = yc + xd; // Third corner x4 = xc + yd ; y4 = yc - xd; // Fourth corner 

在有四个正方形点后,您可以检查给定点是否位于正方形内,然后四个三角形的面积如下图所示将等于正方形面积。 在此处输入图像描述

阅读更多:

https://math.stackexchange.com/questions/506785/given-two-diagonally-opposite-points-on-a-square-how-to-calculate-the-other-two

https://martin-thoma.com/how-to-check-if-a-point-is-inside-a-rectangle/

设顶点为A和B,点为P(图中意外命名为C)。 找到向量AB,AP,BP

在此处输入图像描述

 AB.X = BX - AX AB.Y = BY - AY and so on 

如果点积是非负的,则P位于正方形内

 cA = AP x AB //(AP.X * AB.Y - AP.Y * AB.X) dA = AP dot AB //(AP.X * AB.X + AP.Y * AB.Y) cB = -(AB x BP) dB = -(AB dot BP) 

交叉产品的绝对值小于点积

 dA >= Abs(cA) dB >= Abs(cB) 

(这相当于检查角度是否在-Pi/4..Pi/4范围内)

假设您的问题是2D (如在3DND中,您需要更多信息)。 我会像这样解决它:

  1. 找到2个缺少的顶点

    所以我们知道A,B并想要C,D

    对角线

     M = (A+B)/2 v1 = BM 

    为了获得v2我们可以利用2D矢量(x,y)(y,-x)垂直且大小相同的事实:

     v2 = (v1y,-v2x) 

    其余的很简单:

     C = M - v2 D = M + v2 
  2. 计算2个边缘基矢量

    基础向量

     U = CA V = DA 
  3. 使用点积检查内部范围

    点

     dot(I,J) = (IJ) = (Ix*Jx) + (Iy*Jy) 

    给你IJ的垂直投影(如果两个向量都是单位)或者相反,我们可以利用它来检测点P是否在方形内:

     W = PA tu = (UW) / (|U|*|W|) tv = (VW) / (|V|*|W|) if ((tu>=0.0)&&(tu<=1.0)&&(tv>=0.0)&&(tv<=1.0)) return inside; else return outside; 

只是为了完成矢量的abs值计算如下:

  abs(I) = |I| = sqrt ( Ix*Ix + Iy*Iy )