计算几何_线段交点的快速排斥_跨立实验

附上题的地址

https://vjudge.net/problem/HDU-1086#

// 点是否在矩形
// 矩形点是 st 和 ed
bool IsPointInRectangle(Point jpt, Point st, Point ed)
{
    if (min(st.x, ed.x) <= jpt.x &&
        max(st.x, ed.x) >= jpt.x &&
        max(st.y, ed.y) <= jpt.y &&
        max(st.y, ed.y) >= jpt.y)
        return true;
    return false;
}

/*
两线段相交分为"规范相交"和"非规范相交"。
"规范相交"指的是两条线段恰有唯一一个不是端点的公共点;
而如果一条线段的一个端点在另一条线段上,或者两条线段部分重合,则视为“非规范相交”,
*/
bool IsSegmentIntersect(Point A, Point B, Point C, Point D) {
    // 快速排斥
/*
    //  快速排斥 好理解版本  判断在不在矩形内.
    if (IsPointInRectangle(C, A, B) && IsPointInRectangle(D, A, B)) return false;
    if (GetCross(A, C, B) * GetCross(A, D, B) <= 0.0 &&
        GetCross(C, A, D) * GetCross(C, B, D) <= 0.0)
        return true;
    return false;*/

    // 前3句是快速排斥
    // 后2句是跨立实验  <= 表示允许重叠 端点在另一线段上 < 则不允许
    if (max(A.x, B.x) >= min(C.x, D.x) &&
        min(A.x, B.x) <= max(C.x, D.x) &&
        max(A.y, B.y) >= min(C.y, D.y) &&
        GetCross(A, C, B) * GetCross(A, D, B) <= 0.0 &&
        GetCross(C, A, D) * GetCross(C, B, D) <= 0.0 )
        return true;
    return false;
} 

线段封装

struct Segment {
    Point st;
    Point ed;
    void Read() {
        scanf("%lf%lf%lf%lf", &st.x, &st.y, &ed.x, &ed.y);
    }
}Sg[128];

bool IsSegmentIntersect(Segment A, Segment B) {
    return IsSegmentIntersect(A.st, A.ed, B.st, B.ed);
}

原文地址:https://www.cnblogs.com/cgjh/p/9412887.html

时间: 2024-10-18 10:46:01

计算几何_线段交点的快速排斥_跨立实验的相关文章

叉乘、快速排斥与跨立实验及求取三角形面积

<pre name="code" class="cpp">叉乘 (一)判断方向 (二)判断线段相交 (三)求三角形面积 (一)判断方向 叉乘的性质如下: (1). P x Q > 0; 表示P在Q的顺时针方向; (2). p x Q < 0; 表示P在Q的逆时针方向; (3). P x Q = 0; 表示P和Q是共线的 P(x1,y1),Q(x2,y2), P*Q=x1y2-x2y1 判断结果三种状态 模版为: struct point {

线段相交(快速排斥实验 + 跨立实验)

Description 给定线段P1P2(P1和P2是线段的两端点,且不重合).P3P4(P3和P4是线段的两端点,且不重合),判断P1P2和P3P4是否相交.P1P2和P3P4相交,即指存在一个点P,它既落在P1P2上又落在P3P4上(含线段的端点). Input 输入数据有多组,第一行为测试数据的组数N,下面包括2N行,每组测试数据含2行,第一行为P1P2的坐标值,第二行为P3P4的坐标值,比如下面的数据 表示P1.P2.P3.P4的坐标分别为:P1(0,0),P2(1,1),P3(2,2)

【计算几何】线段相交

问题描述:已知两条线段P1P2和Q1Q2,判断P1P2和Q1Q2是否相交,若相交,求出交点. 两条线段的位置关系可以分为三类:有重合部分.无重合部分但有交点.无交点. 算法的步骤如下: 1.快速排斥实验. 设以线段P1P2为对角线的矩形为R,设以线段Q1Q2为对角线的矩形为T,如果R和T不相交,则两线段不相交. 2.跨立实验. 如果两线段相交,则两线段必然相互跨立对方. 若P1P2跨立Q1Q2,则矢量(P1-Q1)和(P2-Q1)位于矢量(Q2-Q1)的两侧,即( P1 - Q1 ) × ( Q

【TOJ 1288】计算几何练习题――线段相交(模板题)

描述 线段相交测试在计算几何中是经常用到的,给定线段P1P2(P1和P2是线段的两端点,且不重合).P3P4(P3和P4是线段的两端点,且不重合),判断P1P2和P3P4是否相交.P1P2和P3P4不重合,即指只存在一个点P,它既落在P1P2上又落在P3P4上(含线段的端点). 输入 输入数据有多组,第一行为测试数据的组数N,下面包括2N行,每组测试数据含2行,第一行为P1P2的坐标值,第二行为P3P4的坐标值,比如下面的数据10 0 1 12 2 3 3表示P1.P2.P3.P4的坐标分别为:

Pick-up sticks(计算几何_线段相交)

Description Stan has n sticks of various length. He throws them one at a time on the floor in a random way. After finishing throwing, Stan tries to find the top sticks, that is these sticks such that there is no stick on top of them. Stan has noticed

Spring_MVC_教程_快速入门_深入分析

Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明

hdu 1086(计算几何入门题——计算线段交点个数)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7167    Accepted Submission(s): 3480 Problem Description Ma

poj1039——计算几何 求直线与线段交点,判断两条直线是否相交

poj1039——计算几何  求直线与线段交点,判断两条直线是否相交 Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9439   Accepted: 2854 Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic light pipeline. During the de

python基础教程_学习笔记8:序列_练习与总结_1

序列_练习与总结 每次处理一个字符 任务: 用每次处理一个字符的方式处理字符串. 方案: 可以创建一个列表,列表的子项是字符串的字符.python实际上并没有一个特别的类型来对应"字符"并以此和字符串区分开来.可以调用内建的list,用字符串作为参数: thelist=list(thestring) 也可以不创建一个列表,直接用for语句完成对该字符串的循环遍历: for c in thestring: do_something_with(c) 或者使用列表推导中的for来遍历: re