C ++查找并行线条边界内的坐标

时间:2016-04-11 13:28:52

标签: c++ math

我获得了线PQ和边界。我必须找到给定线的两条平行线,但线应该与边界相交。我也知道给定线的平行线之间的距离。我需要找到P'Q'和P“Q”。 请任何人给出一个简单的解决方案。enter image description here

    float vx = x2 - x1;
    float vy = y2 - y1;
    float mag = sqrt(vx * vx + vy * vy);

    float t = (mag / 2.0) / mag;
    float px = (1 - t) * x1 + t * x2;
    float py = (1 - t) * y1 + t * y2;

我刚刚通过上面的代码找到了PQ的中心点。此外,我计划通过已知距离绘制垂直线(px,py),然后绘制垂直于该新线的线(这些线将与PQ平行),直到该新线的端点。但我无法实现它。任何人都可以帮助我或建议我一个懂数学的方法

1 个答案:

答案 0 :(得分:0)

最后我得到了解决方案。 步骤是。 首先,我得到了PQ的中心点。

POINT find_a_point_in_distance(float x1, float y1, float x2, float y2, float len = 0) {
    float vx = x2 - x1;
    float vy = y2 - y1;
    float mag = sqrt(vx * vx + vy * vy);

    float t = len == 0 ? ((mag / 2.0) / mag) : (len / mag);

    float px = (1 - t) * x1 + t * x2;
    float py = (1 - t) * y1 + t * y2;
    POINT res = { px, py };
    return res;
}

这里(px,py)是PQ的中心点。 然后我找到垂直线(px,py)。 我已经在问题中提到我知道PQ和P'Q'之间的距离也是PQ和P“Q”。所以我使用那个距离在垂直线上得到两个点。最后我知道线PQ的角度,所以P'Q'和P“Q”应该在同一个角度,使用这些细节,我可以得到线P'Q'和P“Q”我想要的长度。在下面的代码中,我得到的行P'Q'和P“Q”与矩形框的对角线的长度。

        POINT res = find_a_point_in_distance(x1, y1, x2, y2);
        POINT res2 = find_a_point_in_distance(res.x, res.y, x2, y2, halflen);
        float cosA = acos((res2.x - res.x) / halflen) * 180 / PI;
        float sinA = asin((res2.y - res.y) / halflen) * 180 / PI;

        float cosAngle = cos((cosA + 90.0) * PI / 180.0);
        float sinAngle = sin((sinA + 90.0) * PI / 180.0);

        float cx1 = res.x + halflen * cosAngle;
        float cy1 = res.y + halflen * sinAngle;

        float cosAngle2 = cos((cosA - 90.0) * PI / 180.0);
        float sinAngle2 = sin((sinA - 90.0) * PI / 180.0);

        float cx2 = res.x + halflen * cosAngle2;
        float cy2 = res.y + halflen * sinAngle2;


        float diagonal = sqrt(width * width + height * height);
        float halfdiagonal = diagonal / 2.0;

        float cosAngleT = cos(cosA * PI / 180.0);
        float sinAngleT = sin(sinA * PI / 180.0);
        float cosAngleTD = cos((cosA + 180) * PI / 180.0);
        float sinAngleTD = sin((sinA + 180) * PI / 180.0);

        float cx10 = cx1 + halfdiagonal * cosAngleT;
        float cy10 = cy1 + halfdiagonal * sinAngleT;
        float cx11 = cx1 + halfdiagonal * cosAngleTD;
        float cy11 = cy1 + halfdiagonal * sinAngleTD;

        float cx20 = cx2 + halfdiagonal * cosAngleT;
        float cy20 = cy2 + halfdiagonal * sinAngleT;
        float cx21 = cx2 + halfdiagonal * cosAngleTD;
        float cy21 = cy2 + halfdiagonal * sinAngleTD;

这里(cx10,cy10)和(cx11,cy11)是P'Q'和 (cx20,cy20)和(cx21,cy21)是P“Q”行。

然后我终于找到了P'Q'和P“Q”的交叉点与矩形的所有边