当前位置: 首页 > wzjs >正文

绵阳网站开发制作公司官网多少钱

绵阳网站开发,制作公司官网多少钱,英文淘宝网站建设,内部网站建设、问题描述 给定n条线段,要求根据它们的交点将线段打断,生成新的线段集合。 定义结构: 代码如下: typedef struct tagStruVertex {double x;double y;tagStruVertex(double x 0, double y 0) : x(x), y(y) {}// 重载运算符&#…

问题描述
给定n条线段,要求根据它们的交点将线段打断,生成新的线段集合。
定义结构:
代码如下:

typedef struct tagStruVertex
{double x;double y;tagStruVertex(double x = 0, double y = 0) : x(x), y(y) {}// 重载运算符,用于排序和去重bool operator<(const tagStruVertex& other) const {if (x != other.x) return x < other.x;return y < other.y;}bool operator==(const tagStruVertex& other) const {return fabs(x - other.x) < 1e-9 && fabs(y - other.y) < 1e-9;}bool operator!=(const tagStruVertex& other) const {if (x != other.x || y != other.y) return true;return false;}double distanceTo(
const tagStruVertex& point) const{double disX = x - point.x;double disY = y - point.y;return sqrt(disX * disX + disY * disY);}
}Vertex;
typedef struct tagStruSegment
{Vertex start, end;tagStruSegment(Vertex p1, Vertex p2) : start(p1), end(p2) {}tagStruSegment() {}// 重载运算符,用于 set 去重bool operator<(const tagStruSegment& other) const {if (start == other.start) return end < other.end;return start < other.start;}bool operator==(const tagStruSegment& other) const {if ((start == other.start && end == other.end) || (start == other.end && end == other.start))return true;elsereturn false;}
}Segment;

判断交点
使用线段相交的几何算法来检测两条线段是否相交。计算交点坐标,如果相交,则返回交点。
代码如下:

// 计算叉积
double cross(const Vertex& o, const Vertex& a, const Vertex& b) {return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
}//判断点是否在线段上
bool IsPointOnSegment(const Vertex& p, const Segment& seg) {double crossProd = cross(seg.start, seg.end, p);if (fabs(crossProd) > 1e-9) return false; // 不在直线上double minX = min(seg.start.x, seg.end.x);double maxX = max(seg.start.x, seg.end.x);double minY = min(seg.start.y, seg.end.y);double maxY = max(seg.start.y, seg.end.y);return (p.x >= minX - 1e-9 && p.x <= maxX + 1e-9) &&
(p.y >= minY - 1e-9 && p.y <= maxY + 1e-9);
}//判断两条线段是否相交:
bool IsCross(const Segment& seg1, const Segment& seg2, Vertex& intersect) {Vertex a = seg1.start, b = seg1.end;Vertex c = seg2.start, d = seg2.end;double cross1 = cross(a, b, c);double cross2 = cross(a, b, d);double cross3 = cross(c, d, a);double cross4 = cross(c, d, b);// 判断是否相交if (((cross1 * cross2) < 0) && ((cross3 * cross4) < 0)) {// 计算交点double t = cross3 / (cross3 - cross4);intersect.x = a.x + t * (b.x - a.x);intersect.y = a.y + t * (b.y - a.y);return true;}// 处理共线情况if (fabs(cross1) < 1e-9 && IsPointOnSegment(c, seg1)) { intersect = c; return true; }if (fabs(cross2) < 1e-9 && IsPointOnSegment(d, seg1)) { intersect = d; return true; }if (fabs(cross3) < 1e-9 && IsPointOnSegment(a, seg2)) { intersect = a; return true; }if (fabs(cross4) < 1e-9 && IsPointOnSegment(b, seg2)) { intersect = b; return true; }return false;
}

线段根据交点打断后生成新的线段
代码如下:

// 打断线段
vector<Segment> AdjustSegment(const Segment& seg, const set<Vertex>& intersections) {vector<Segment> vecSegments;vector<Vertex> points;// 将起点和终点加入points.push_back(seg.start);for (const auto& p : intersections) {if (IsPointOnSegment(p, seg)) {points.push_back(p);}}points.push_back(seg.end);// 按x坐标排序(或按y坐标,取决于线段方向)sort(points.begin(), points.end());// 生成小线段for (size_t i = 1; i < points.size(); ++i) {vecSegments.push_back(Segment(points[i - 1], points[i]));}return vecSegments;
}vector<Segment> AdjustSegments(const vector<Segment>& segments) {vector<Segment> vecSegments;for (size_t i = 0; i < segments.size(); ++i) {set<Vertex> intersections;// 查找当前线段与其他线段的交点for (size_t j = 0; j < segments.size(); ++j) {if (i == j) continue;Vertex intersect;if (IsCross(segments[i], segments[j], intersect)) {intersections.insert(intersect);}}// 打断当前线段vector<Segment> lines = AdjustSegment(segments[i], intersections);vecSegments.insert(vecSegments.end(), lines.begin(), lines.end());}// 使用 set 去重set<Segment> uniqueSegments(vecSegments.begin(), vecSegments.end());return vector<Segment>(uniqueSegments.begin(), uniqueSegments.end());
}

调用测试
代码如下:

vector<Segment> segments = {Segment(Vertex(0, 0), Vertex(30, 0)),Segment(Vertex(0, 10), Vertex(30, 10)),Segment(Vertex(0, 20), Vertex(30, 20)),Segment(Vertex(0, 30), Vertex(30, 30)),Segment(Vertex(0, 0), Vertex(0, 30)),Segment(Vertex(10, 0), Vertex(10, 30)),Segment(Vertex(20, 0), Vertex(20, 30)),Segment(Vertex(30, 0), Vertex(30, 30))
};
vector<Segment> vecSegments = AdjustSegments(segments);
//过滤掉长度为0的线段
for (auto it = vecSegments.begin(); it != vecSegments.end(); ) {if (it->start.distanceTo(it->end) == 0)it = vecSegments.erase(it);  // 如果匹配,删除元素并更新迭代器else ++it;  // 如果不匹配,继续遍历}
//处理完成最终vecSegments里边的结果即为打断后的所有小线段

处理完得到小线段的数量为24条小线段。结果与预期一致。

http://www.dtcms.com/wzjs/189774.html

相关文章:

  • 罗湖做网站哪家好竞价推广出价多少合适
  • 网站用图片做背景图片如何在百度上投放广告
  • 做网站产品图片素材推广团队
  • 深圳有哪些网站建设晋城seo
  • 软件测试培训费多少钱聊城网站seo
  • 西安网站推广招聘网苏州手机关键词优化
  • 关于文案的网站广告联盟有哪些平台
  • 做网站一般图片多大搜狗推广登录入口
  • 安阳网站建设优化百度流量推广项目
  • 网页.网站.主页.网址.域名有什么联系网络营销方案策划
  • 做外贸生意上国外网站免费下载百度seo
  • 前端开发和后端开发哪个赚钱seo诊断分析在线工具
  • 南宁 建网站长尾关键词网站
  • 织梦英文网站模板网站增加外链的方法有哪些
  • 质控中心网站建设申请佛山疫情最新情况
  • 浏阳网站建设tvshown最新国际军事动态
  • 搭建网站需要钱吗磁力搜索器kitty
  • 网站建设案例新闻做销售怎样去寻找客户
  • 在线支付的网站怎么做淮安网站seo
  • 阳泉网站建设公司刚刚突发1惊天大事
  • 做网站竞价是什么意思荥阳网络推广公司
  • 网站服务器放置地949公社招聘信息
  • PHP网站开发与管理设计心得北京网站制作公司
  • 一级a做爰片不卡的网站如何推广seo
  • 岳阳做网站最新的疫情情况
  • 织梦网站怎么做seo优化宁波seo怎么做引流推广
  • 网站运行费用聊城seo整站优化报价
  • 做网站需要的技能搜索风云排行榜
  • 物流案例 网站搜索引擎是软件还是网站
  • 广州网站排名优化seo优化论坛