Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在给定两个相反点的二维矩阵中绘制正方形_Algorithm_Matrix_Geometry_2d - Fatal编程技术网

Algorithm 如何在给定两个相反点的二维矩阵中绘制正方形

Algorithm 如何在给定两个相反点的二维矩阵中绘制正方形,algorithm,matrix,geometry,2d,Algorithm,Matrix,Geometry,2d,我得到了一个正方形的两个相对点的坐标(例如,正方形ABCD中的点a和C),我需要将正方形绘制为ASCII,其中每个字符表示二维矩阵中的一个点:''(空格)表示空,而'X'表示满,'\n'显然是行的结束和下一行的开始。正方形可以旋转。我该怎么做 现在多亏了@avysk在这篇文章中的回答,我可以确定正方形中缺少的两个点(显然,当问题被搁置时,我问错了论坛) 现在我在想,因为矩阵不应该太大,我会迭代矩阵的每个点,并有一个条件,比如 for (y = 0; y < height; y++) {

我得到了一个正方形的两个相对点的坐标(例如,正方形ABCD中的点a和C),我需要将正方形绘制为ASCII,其中每个字符表示二维矩阵中的一个点:''(空格)表示空,而'X'表示满,'\n'显然是行的结束和下一行的开始。正方形可以旋转。我该怎么做

现在多亏了@avysk在这篇文章中的回答,我可以确定正方形中缺少的两个点(显然,当问题被搁置时,我问错了论坛)

现在我在想,因为矩阵不应该太大,我会迭代矩阵的每个点,并有一个条件,比如

for (y = 0; y < height; y++) {
    for (x = 0; x < width; x++) {
        matrix[y][x] = (in_square(x, y, array_of_4_points)) ? 'X' : ' ';
    }
}
(y=0;y{ 对于(x=0;x
我缺少in_square函数的逻辑。

你可以用点积来实现这一点,而不需要找到B和D

如果将点(称为p)投影到对角线上,则如果从该点到对角线的距离小于或等于从投影点到最近角(A或C)的距离,则该点位于正方形内。这是假设“在线中”

首先,找出点在AC方向上离A的距离。该值必须为正值,否则对角线上的投影点位于A和C之间的线段之外

bool in_square(Point P, Point A, Point C)
{
    float dot1 = ((P.x - A.x) * (C.x - A.x)) + ((P.y - A.y) * (C.y - A.y));
    if(dot1 < 0.0f)
        return false;
bool in_square(点P、点A、点C)
{
浮点dot1=((P.x-A.x)*(C.x-A.x))+((P.y-A.y)*(C.y-A.y));
如果(dot1<0.0f)
返回false;
接下来,找出该点在CA方向距离C多远,并进行同样的测试:

    float dot2 = ((P.x - C.x) * (A.x - C.x)) + ((P.y - C.y) * (A.y - C.y));
    if(dot2 < 0.0f)
        return false;
float dot2=((P.x-C.x)*(A.x-C.x))+((P.y-C.y)*(A.y-C.y));
如果(dot2<0.0f)
返回false;
现在计算一个从对角线上的一个点(例如a)到点p的向量,然后取它与一个与对角线垂直的向量的点积。这给出了p到对角线的距离。将该距离与点1和点2中的最小值进行比较:

    float dot3 = ((P.x - A.x) * (C.y - A.y)) + ((P.y - A.y) * (A.x - C.x));
    if(dot3 < 0.0f)
        dot3 = -dot3; // abs value
    if(dot1 < dot2)
        return dot3 <= dot1;
    else
        return dot3 <= dot2;
}
float dot3=((P.x-A.x)*(C.y-A.y))+((P.y-A.y)*(A.x-C.x));
如果(dot3<0.0f)
dot3=-dot3;//abs值
if(dot1