问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请C++高手做一个判断三角形和矩形是否相交的程序

发布网友 发布时间:2022-05-19 00:24

我来回答

1个回答

热心网友 时间:2023-11-24 09:13

class Vector2D { //2D向量类
public:
    double x, y;
    Vector2D(double x_ = 0, double y_ = 0): x(x_), y(y_) {}
};

bool isZero(const Vector2D &vec, double tolerance = 0.05) const {
            return std::abs(vec.x) < tolerance && std::abs(vec.y) < tolerance;
}

Vector2D tripleProct(const Vector2D &v1, const Vector2D &v2, const Vector2D &v3) { //三角乘积
    double p = v1.x * v2.y - v1.y * v2.x;
    return Vector2D(-p * v3.y, p * v3.x);
}

double dot(const Vector2D &v1, cosnt Vector2D &v2) { //点乘
    return v1.x * v2.x + v1.y * v2.y;
}

Vector2D negate(const Vector2D &vec) { //向量取反
    return Vector2D(-vec.x, -vec.y);
}

Vector2D sub(const Vector2D &v1, const Vector2D &v2) { //向量相减
    return Vector2D(v1.x - v2.x, v1.y - v2.y);
}

Vector2D getFarthestPoint(const Vector2D &dir, const Vector2D poly[], int len) { //求一个凸多边形poly在某个方向dir上最远的一点
    Vector2D bestPoint = poly[0];
    double bestProj = dot(bestPoint, dir);
    for (int i = 1; i < len; ++i) {
        Vector2D curr = poly[i];
        double proj = dot(curr, dir);
        if (proj > bestProj) {
            bestPoint = curr;
            bestProj = proj;
        }
    }
    return bestPoint;
}

Vector2D getSupportPoint(const Vector2D &dir, const Vector2D poly1[], int len1, const Vector2D poly2[], int len2) { //GJK算法的一部分, 求两个凸多边形的闵可夫斯基差在某个方向dir上最远的一点
    Vector2D v1 = getFarthestPoint(dir, poly1, len1),
             v2 = getFarthestPoint(negate(dir), poly2, len2);
    return sub(v1, v2);
}

bool isIntersect(const Vector2D poly1[], int len1, const Vector2D poly2[], int len2) {
    Vector2D simplexA, simplexB, simplexC, dir = Vector2D(-1, -1);

    simplexA = getSupportPoint(dir, poly1, len1, poly2, len2);
    if (dot(simplexA, dir) <= 0) {
        return false;
    }

    dir = negate(simplexA);
    simplexB = getSupportPoint(dir, poly1, len1, poly2, len2);
    if (dot(simplexB, dir) <= 0) {
        return false;
    }

    Vector2D ab = sub(simplexB, simplexA);
    dir = tripleProct(ab, negate(simplexA), ab);

    for (int i = 25; i--;) { //25是最大迭代次数, 一般迭代3次以内就能完成
        if (isZero(dir)) {
            return true;
        }

        simplexC = getSupportPoint(dir, poly1, len1, poly2, len2);
        if (dot(simplexC, dir) <= 0) {
            return false;
        }

        Vector2D ba = sub(simplexA, simplexB),
                ac = sub(simplexC, simplexA),
                bc = sub(simplexC, simplexB),
                acPerp = tripleProct(ac, negate(ba), ac),
                bcPerp = tripleProct(bc, ba, bc);

        if (dot(acPerp, simplexA) > 0) {
            simplexB = simplexC;
            dir = negate(acPerp);
        } else if (dot(bcPerp, simplexB) > 0) {
            simplexA = simplexC;
            dir = negate(bcPerp);
        } else {
            return true;
        }
    }

    return false;
}


这个是我把自己的代码里的一段截出来改了下变量名和参数什么的, 不确定有没哪里漏了改的, 如果运行有错误可以自己修一下

isIntersect可以判断任意两个凸多边形是否相交, 用的GJK算法

三角形和矩形存在一个Vector2D数组里, 用isIntersect(poly1, poly1len, poly2, poly2len)就能判断

改一下getFarthestPoint还能变成任意两个凸图形是否相交

热心网友 时间:2023-11-24 09:13

class Vector2D { //2D向量类
public:
    double x, y;
    Vector2D(double x_ = 0, double y_ = 0): x(x_), y(y_) {}
};

bool isZero(const Vector2D &vec, double tolerance = 0.05) const {
            return std::abs(vec.x) < tolerance && std::abs(vec.y) < tolerance;
}

Vector2D tripleProct(const Vector2D &v1, const Vector2D &v2, const Vector2D &v3) { //三角乘积
    double p = v1.x * v2.y - v1.y * v2.x;
    return Vector2D(-p * v3.y, p * v3.x);
}

double dot(const Vector2D &v1, cosnt Vector2D &v2) { //点乘
    return v1.x * v2.x + v1.y * v2.y;
}

Vector2D negate(const Vector2D &vec) { //向量取反
    return Vector2D(-vec.x, -vec.y);
}

Vector2D sub(const Vector2D &v1, const Vector2D &v2) { //向量相减
    return Vector2D(v1.x - v2.x, v1.y - v2.y);
}

Vector2D getFarthestPoint(const Vector2D &dir, const Vector2D poly[], int len) { //求一个凸多边形poly在某个方向dir上最远的一点
    Vector2D bestPoint = poly[0];
    double bestProj = dot(bestPoint, dir);
    for (int i = 1; i < len; ++i) {
        Vector2D curr = poly[i];
        double proj = dot(curr, dir);
        if (proj > bestProj) {
            bestPoint = curr;
            bestProj = proj;
        }
    }
    return bestPoint;
}

Vector2D getSupportPoint(const Vector2D &dir, const Vector2D poly1[], int len1, const Vector2D poly2[], int len2) { //GJK算法的一部分, 求两个凸多边形的闵可夫斯基差在某个方向dir上最远的一点
    Vector2D v1 = getFarthestPoint(dir, poly1, len1),
             v2 = getFarthestPoint(negate(dir), poly2, len2);
    return sub(v1, v2);
}

bool isIntersect(const Vector2D poly1[], int len1, const Vector2D poly2[], int len2) {
    Vector2D simplexA, simplexB, simplexC, dir = Vector2D(-1, -1);

    simplexA = getSupportPoint(dir, poly1, len1, poly2, len2);
    if (dot(simplexA, dir) <= 0) {
        return false;
    }

    dir = negate(simplexA);
    simplexB = getSupportPoint(dir, poly1, len1, poly2, len2);
    if (dot(simplexB, dir) <= 0) {
        return false;
    }

    Vector2D ab = sub(simplexB, simplexA);
    dir = tripleProct(ab, negate(simplexA), ab);

    for (int i = 25; i--;) { //25是最大迭代次数, 一般迭代3次以内就能完成
        if (isZero(dir)) {
            return true;
        }

        simplexC = getSupportPoint(dir, poly1, len1, poly2, len2);
        if (dot(simplexC, dir) <= 0) {
            return false;
        }

        Vector2D ba = sub(simplexA, simplexB),
                ac = sub(simplexC, simplexA),
                bc = sub(simplexC, simplexB),
                acPerp = tripleProct(ac, negate(ba), ac),
                bcPerp = tripleProct(bc, ba, bc);

        if (dot(acPerp, simplexA) > 0) {
            simplexB = simplexC;
            dir = negate(acPerp);
        } else if (dot(bcPerp, simplexB) > 0) {
            simplexA = simplexC;
            dir = negate(bcPerp);
        } else {
            return true;
        }
    }

    return false;
}


这个是我把自己的代码里的一段截出来改了下变量名和参数什么的, 不确定有没哪里漏了改的, 如果运行有错误可以自己修一下

isIntersect可以判断任意两个凸多边形是否相交, 用的GJK算法

三角形和矩形存在一个Vector2D数组里, 用isIntersect(poly1, poly1len, poly2, poly2len)就能判断

改一下getFarthestPoint还能变成任意两个凸图形是否相交

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 构建平面三角形类,并使该类具有判断任意两三角形是否相交相离包含的 构造平面三角形类,并使该类具有判断,任意两三角形是否相交,相离包含的 如何检测t-mouse这样的三线程程序? 易飞ERP触发器问题,超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32) 易飞ERP触发器 企业-系统 程序 构造平面三角形类,并使该类具有判断任意两三角形是否相交 企业版是什么?都有哪些什么功能介绍? 企业版是什么?都有哪些什么功能介绍? 兽血沸腾答题获卡悬分 描写水磨沟公园一年四季的景色的作文300字 《妻子5》陈建斌告白蒋勤勤状况百出,他俩的人设是什么? 力一的生平 仙剑3雪山黑屏死机 ★跑跑卡丁车总共有哪些技术??? 卡丁车成绩如何提高?? 绝地求生卡在雪山画面就进不去了,怎么办 宝宝退烧后嗓子哑是怎么回事 我的被封,怎么解决? 谁知道第四套人民币一元的值多少钱一张? 光盘版office2013如何获取25位产品密匙? 八旬老汉为什么用拐棍杀妻? 鸡蛋可以生喝么 word需要激活,我找不到25位产品密钥。笔记本电脑是别人送的。 潜行狙击是不是学警狙击的续集 潜行狙击还有没有续集啊 八旬老汉让女儿给自己洗澡违法不违法 是不是乱论 鸡蛋能生喝吗 小伙骑电动车撞倒8旬老汉致去世,小伙将面临什么处罚? 生鸡蛋到底能不能喝&quot;? 有的说能,有的说不能.我迷糊了... 法网阻击是不是潜行狙击的续集 怎么下载讯尔奇定位软件 潜行狙击会有续集么? 变节 潜罪犯是潜行狙击的续集吗 干红薯叶怎么做比较适合食用? 三星手机在哪下载定位app 干地瓜叶的做法中,有哪些做出来的比较合大众口味? 如何定位找回OPPO手机? 使用权可以继承吗 浙江宁波一八旬老汉让人搭车出车祸遭索赔 ,*最终是如何判决此案的?