链接:https://www.nowcoder.com/test/21499425/summary
11、框选线段
在二维平面坐标系中,已知存在一条线段(图中P1->p2)和一个矩形区域,编程计算得出线段被矩形区域裁剪的新起始点。
注意以下要求:
A、线段是有方向的,裁剪得到的新线段也需要保持原线段的方向;下图中,线段的描述是P1->p2,则裁剪的结果是P3->p4,反之,如果线段描述是P2->P1,则结果是P4->P3
B、线段的起始点在矩形区域里面时,裁剪的结果则就是原始线段
C、当线段与矩形区域没有相交线段的时候,结果输出“-1”

#include <iostream>
using namespace std;
struct Point {
float x, y;
};
struct Rect {
Point leftBottom, rightTop;
bool contain(const Point& pt) {
return pt.x > leftBottom.x&& pt.x<rightTop.x && pt.y>leftBottom.y&& pt.y < rightTop.y;
}
void cut(Point& pt, const Point& dir) { //根据方向向量将点裁剪到矩形上
if (contain(pt)) //如果点在矩形内,则不需要对它裁剪
return;
Point offset = { 1,dir.y / dir.x }; //确定水平方向,计算垂直方向的偏移
if (pt.x > rightTop.x)
pt = { rightTop.x,pt.y + offset.y * (rightTop.x - pt.x) };
else if (pt.x < leftBottom.x)
pt = { leftBottom.x,pt.y + offset.y * (leftBottom.x - pt.x) };
offset = { dir.x / dir.y,1 }; //确定垂直方向,计算水平方向的偏移
if (pt.y > rightTop.y)
pt = { pt.x + offset.x * (rightTop.y - pt.y), rightTop.y };
else if (pt.y < leftBottom.y)
pt = { pt.x + offset.x * (leftBottom.y - pt.y), leftBottom.y };
}
};
istream& operator>>(istream& in, Poin

本文探讨了计算机科学中的两个经典问题:裁剪二维平面中的线段和寻找网格上的最短路径字符串。通过具体示例,详细介绍了如何通过编程解决这些问题,包括算法设计和代码实现。
&spm=1001.2101.3001.5002&articleId=106544735&d=1&t=3&u=e801f81ccc9545faa270b4af2f3502e1)
2275

被折叠的 条评论
为什么被折叠?



