多边形边的插值

这篇具有很好参考价值的文章主要介绍了多边形边的插值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多边形边的插值

算法描述及提问:
给定一个最小长度,对多边形的每一条边不断的对半插值,使得插值后的每一条边都要不大于最小长度。

测试ChatGPT - 中文版 VSCode插件。
多边形边的插值,算法练习,计算机图形学,C++,算法,计算几何,多边形插值,边插值

Chat GPT给出的结果:

#include <iostream>
#include <vector>
#include <cmath>

struct Point {
    double x;
    double y;
};

double distance(const Point& p1, const Point& p2) {
    double dx = p2.x - p1.x;
    double dy = p2.y - p1.y;
    return std::sqrt(dx * dx + dy * dy);
}

std::vector<Point> interpolatePolygon(const std::vector<Point>& polygon, double minLength) {
    std::vector<Point> interpolatedPoints;

    for (size_t i = 0; i < polygon.size(); i++) {
        size_t j = (i + 1) % polygon.size();
        double segmentDistance = distance(polygon[i], polygon[j]);

        if (segmentDistance <= minLength) {
            interpolatedPoints.push_back(polygon[i]);  // 将原始顶点添加到插值点列表
        } else {
            int numInterpolatedPoints = static_cast<int>(segmentDistance / minLength);
            double stepSize = segmentDistance / (numInterpolatedPoints + 1);

            for (int k = 1; k <= numInterpolatedPoints; k++) {
                double factor = stepSize * k / segmentDistance;
                double newX = polygon[i].x + factor * (polygon[j].x - polygon[i].x);
                double newY = polygon[i].y + factor * (polygon[j].y - polygon[i].y);
                interpolatedPoints.push_back({newX, newY});  // 添加插值点到列表
            }
        }
    }

    return interpolatedPoints;
}

int main() {
    // 定义多边形的顶点
    std::vector<Point> polygon = {
        {0.0, 0.0}, {2.0, 0.0}, {2.0, 2.0}, {0.0, 2.0}
    };
    
    double minLength = 1.0;
    
    // 进行边均匀插值并打印结果
    std::vector<Point> interpolatedPoints = interpolatePolygon(polygon, minLength);
    
    for (const auto& point : interpolatedPoints) {
        std::cout << "Interpolated Point: (" << point.x << ", " << point.y << ")\n";
    }

    return 0;
}

多边形边的插值,算法练习,计算机图形学,C++,算法,计算几何,多边形插值,边插值
显然是错误的。
正确的结果:
多边形边的插值,算法练习,计算机图形学,C++,算法,计算几何,多边形插值,边插值

修改后的结果1

#include <iostream>
#include <vector>
#include <cmath>

struct Point {
    double x;
    double y;
};

double distance(const Point& p1, const Point& p2) {
    double dx = p2.x - p1.x;
    double dy = p2.y - p1.y;
    return std::sqrt(dx * dx + dy * dy);
}

std::vector<Point> interpolatePolygon(const std::vector<Point>& polygon, double minLength) {
    std::vector<Point> interpolatedPoints;

    for (size_t i = 0; i < polygon.size(); i++) {
        size_t j = (i + 1) % polygon.size();
        double segmentDistance = distance(polygon[i], polygon[j]);

        if (segmentDistance <= minLength) {
            interpolatedPoints.push_back(polygon[i]);  // 将原始顶点添加到插值点列表
        }
        else {
            int numInterpolatedPoints = ceil(segmentDistance / minLength);
            double stepSize = segmentDistance / numInterpolatedPoints;

            for (int k = 1; k <= numInterpolatedPoints; k++) {
                double factor = stepSize * k / segmentDistance;
                double newX = polygon[i].x + factor * (polygon[j].x - polygon[i].x);
                double newY = polygon[i].y + factor * (polygon[j].y - polygon[i].y);
                interpolatedPoints.push_back({ newX, newY });  // 添加插值点到列表
            }
        }
    }

    return interpolatedPoints;
}

int main() {
    // 定义多边形的顶点
    std::vector<Point> polygon = {
        {0.0, 0.0}, {2.0, 0.0}, {2.0, 2.0}, {0.0, 2.0}
    };

    double minLength = 2;

    // 进行边均匀插值并打印结果
    std::vector<Point> interpolatedPoints = interpolatePolygon(polygon, minLength);

    for (const auto& point : interpolatedPoints) {
        std::cout << "Interpolated Point: (" << point.x << ", " << point.y << ")\n";
    }

    return 0;
}

修改后的结果2

#include <iostream>
#include <vector>
#include <cmath>

struct Point {
    double x;
    double y;
};

double distance(const Point& p1, const Point& p2) {
    double dx = p2.x - p1.x;
    double dy = p2.y - p1.y;
    return std::sqrt(dx * dx + dy * dy);
}

std::vector<Point> interpolatePolygon(const std::vector<Point>& polygon, double minLength) {
    std::vector<Point> interpolatedPoints;

    int numVertices = polygon.size();
    std::vector<double> segmentLengths(numVertices);

    // 计算各边长度
    for (int i = 0; i < numVertices; i++) {
        int nextIndex = (i + 1) % numVertices;
        segmentLengths[i] = distance(polygon[i], polygon[nextIndex]);
    }


    for (int i = 0; i < numVertices; i++) {
        int nextIndex = (i + 1) % numVertices;
        double dx = polygon[nextIndex].x - polygon[i].x;
        double dy = polygon[nextIndex].y - polygon[i].y;
        double segmentDistance = distance(polygon[i], polygon[nextIndex]);

        interpolatedPoints.push_back(polygon[i]);

        if (segmentDistance > minLength) {
            
            int n = ceil(segmentDistance / minLength);
            int p = ceil(n / 2);
            for (int j = 0; j < p*2-1; j++) {
                double newX = polygon[i].x + pow(0.5,p) * dx*(1+j);
                double newY = polygon[i].y + pow(0.5,p) * dy*(1+j);
                interpolatedPoints.push_back({ newX, newY });
            }
        }
    }
    return interpolatedPoints;
}

int main() {
    // 定义多边形的顶点
    std::vector<Point> polygon = {
        {0.0, 0.0}, {2.0, 0.0}, {2.0, 2.0}, {0.0, 2.0}
    };
    double minLength = 1.5;
    // 进行边均匀插值并打印结果
    std::vector<Point> interpolatedPoints = interpolatePolygon(polygon, minLength);
    for (const auto& point : interpolatedPoints) {
        std::cout << "Interpolated Point: (" << point.x << ", " << point.y << ")\n";
    }
    return 0;
}

总结

使用ChatGPT-中文版 VSCode,基本可以写出一个简单的算法,但是正确与否还需要个人Debug及修改,可以节省一部分时间和精力。

参考

1、https://blog.csdn.net/mrbaolong/article/details/131585575?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131585575%22%2C%22source%22%3A%22mrbaolong%22%7D文章来源地址https://www.toymoban.com/news/detail-527665.html

到了这里,关于多边形边的插值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何判断两个多边形是否相交?——多边形相交判定算法详解

    如何判断两个多边形是否相交?——多边形相交判定算法详解 在计算机图形学中,判断两个多边形是否相交是一项很重要的任务。这涉及到各种应用场景,如碰撞检测、模拟物理效果等。在本篇文章中,我们将会介绍多边形相交判定算法的相关知识和实现方式。 首先,我们

    2024年02月14日
    浏览(36)
  • 判断点在多边形内算法的C++实现

    本篇博客介绍了使用射线法判断点在多边形内部还是外部的算法,并通过C++做了具体实现 1. 算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这

    2024年02月12日
    浏览(36)
  • 【计算几何】凸多面体重叠判断算法:GJK 算法详解 & C++代码实现二维情形的凸多边形重叠判断

    GJK 算法是由 Gilbert,Johnson,Keerthi 三位前辈发明的, 用来计算两个凸多面体之间的碰撞检测 ,以及最近距离。 GJK 算法可以在 O ( M + N ) O(M+N) O ( M + N ) 的时间复杂度内,检测出碰撞,算法在每次迭代的过程中,都会优先选择靠近原点的方向,因此收敛速度会很快。算法的证明

    2024年02月08日
    浏览(45)
  • Java根据坐标经纬度计算两点距离(5种方法)、校验经纬度是否在圆/多边形区域内的算法推荐

    目录 前言 一、根据坐标经纬度计算两点距离(5种方法) 1.方法一 2.方法二 3.方法三 4.方法四 5.方法五 5.1 POM引入第三方依赖 5.2 代码 6.测试结果对比 二、校验经纬度是否在制定区域内 1.判断一个坐标是否在圆形区域内 2.判断一个坐标是否在一个多边形区域内 3.结果 总结   

    2024年02月10日
    浏览(45)
  • opencv 之 外接多边形(矩形、圆、三角形、椭圆、多边形)使用详解

    本文主要讲述opencv中的外接多边形的使用: 多边形近似 外接矩形、最小外接矩形 最小外接圆 外接三角形 椭圆拟合 凸包 将重点讲述最小外接矩形的使用 给一个opencv官方的例程: 过程图像如下: 椭圆拟合一般用于轮廓提取之后: 凸包绘制 计算两个旋转矩形交集: C++版的最

    2024年02月09日
    浏览(50)
  • 3DS MAX三维建模平面基础与初级多边形(可编辑多边形的讲解)

            3DS MAX三维建模平面基础与初级多边形(可编辑多边形的讲解)         欢迎大家来学习3DS MAX教程,在这里先说一下研究好3ds Max一定要一边看教程一边要自己学的操作才能更快的进步,预祝大家学习顺利。         这篇是第四篇关于3ds Max的文章了,基于上一

    2024年04月12日
    浏览(45)
  • 基于C++ 的OpenCV绘制多边形,多边形多条边用不用的颜色绘制

    使用基于C++的OpenCV库来绘制多边形,并且为多边形的不同边使用不同的颜色,可以按照以下步骤进行操作: 首先,确保你已经安装了OpenCV库并配置好了你的开发环境。 导入必要的头文件: 创建一个空白的图像,然后绘制多边形,并为每条边选择不同的颜色: 在这个示例中,

    2024年02月13日
    浏览(28)
  • 计算两个多边形的交集

    已知两个多边形Polygon1和Polygon2,分别由点集C1={P1,P2,...,Pm}和C2={Q1,Q2,...,Qn}表示,求这两个多边形的交集。 两个多边形相交后,其顶点要么是两个多边形边的交点,要么是在多边形内部的点。 计算两个多边形每条边之间的交点。 计算包含在多边形内部的点。 将交点和多边形内

    2024年02月12日
    浏览(48)
  • 使用OpenCV的函数polylines()绘制多条相连的线段和多边形;使用函数fillPoly()绘制带填充效果的多边形

    函数polylines()可用来根据点集绘制多条相连的线段,也可用来绘制多边形。 函数polylines()有两种原型,这里只向大家介绍比较常用的那种原型。 函数polylines()的C++原型如下: 函数polylines()的Python原型如下: 函数polylines()的参数意义如下: img—绘制的多条相连线段或多边形所在

    2024年02月04日
    浏览(41)
  • C#凹多边形求内心

    在计算凹多边形内心时,一种常见的方法是使用三角剖分和重心法。您可以按照以下步骤进行: 将凹多边形进行三角剖分,得到一系列三角形。 对每个三角形计算其重心,重心是三个顶点的平均值。 将所有三角形的重心进行平均,得到凹多边形的内心。 以下是一个简单的示

    2024年01月25日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包