Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 直线离散化算法_C++_Algorithm_Geometry_Algebra - Fatal编程技术网

C++ 直线离散化算法

C++ 直线离散化算法,c++,algorithm,geometry,algebra,C++,Algorithm,Geometry,Algebra,对于由点(x_1,y_1),(x_2,y_2)约束的某些给定直线,有哪些算法和方法可用于将该直线离散为偶数段 从数学上讲,我想人们只会: (1) 找到长度, (2) 除以N个分段数,然后 (3) 根据该数据计算线段点 但我想知道是否有更好或更多的面向“计算机科学”的方法来解决这个问题 我是CS一年级的学生,所以我不知道我在寻找什么,甚至不知道从哪里开始寻找。没有必要计算和使用长度 您可以通过简单的线性插值找到中间点(对于N个相等的线段): for i = 1 to N - 1 Point

对于由点
(x_1,y_1)
(x_2,y_2)
约束的某些给定直线,有哪些算法和方法可用于将该直线离散为偶数段

从数学上讲,我想人们只会:
(1) 找到长度,
(2) 除以N个分段数,然后
(3) 根据该数据计算线段点

但我想知道是否有更好或更多的面向“计算机科学”的方法来解决这个问题


我是CS一年级的学生,所以我不知道我在寻找什么,甚至不知道从哪里开始寻找。

没有必要计算和使用长度

您可以通过简单的线性插值找到中间点(对于N个相等的线段):

for i = 1 to N - 1
    Point[i].X = X1 + (X2 - X1) * i / N
    Point[i].Y = Y1 + (Y2 - Y1) * i / N

如果您关心有效性,请预先计算X_coeff=(X2-X1)/N并在循环内使用此值

无需计算和使用长度

您可以通过简单的线性插值找到中间点(对于N个相等的线段):

for i = 1 to N - 1
    Point[i].X = X1 + (X2 - X1) * i / N
    Point[i].Y = Y1 + (Y2 - Y1) * i / N

如果您关心有效性,请预计算
X_coeff=(X2-X1)/N
并在循环中使用此值

以下示例说明如何从std::cin读取两点(和N),然后计算段,最后将其打印到std::cout

#include <iostream>
#include <vector>

struct point
{
    double x;
    double y;
};

int main()
{
    point P1;
    point P2;
    size_t N;

    std::cin >> P1.x >> P1.y;
    std::cin >> P2.x >> P2.y;
    std::cin >> N;

    std::vector<point> segments(N + 1);

    double x_diff = (P2.x - P1.x) / N;
    double y_diff = (P2.y - P1.y) / N;

    for (size_t i = 1; i < segments.size(); ++i)
    {
        segments[i].x = P1.x + x_diff * i;
        segments[i].y = P1.y + y_diff * i;
    }

    segments[0] = P1;
    for (size_t i = 1; i < segments.size(); ++i)
    {
        std::cout << "(" << segments[i-1].x << "," << segments[i-1].y << ") - ";
        std::cout << "(" << segments[i].x << "," << segments[i].y << ")" << std::endl;
    }
}
#包括
#包括
结构点
{
双x;
双y;
};
int main()
{
P1点;
P2点;
尺寸;
标准:cin>>P1.x>>P1.y;
std::cin>>P2.x>>P2.y;
标准:cin>>N;
std::向量段(N+1);
双x_差异=(P2.x-P1.x)/N;
双y_差异=(P2.y-P1.y)/N;
对于(size_t i=1;istd::cout下面是一个示例,说明如何从std::cin读取两点(和N),然后计算段,最后将它们打印到std::cout

#include <iostream>
#include <vector>

struct point
{
    double x;
    double y;
};

int main()
{
    point P1;
    point P2;
    size_t N;

    std::cin >> P1.x >> P1.y;
    std::cin >> P2.x >> P2.y;
    std::cin >> N;

    std::vector<point> segments(N + 1);

    double x_diff = (P2.x - P1.x) / N;
    double y_diff = (P2.y - P1.y) / N;

    for (size_t i = 1; i < segments.size(); ++i)
    {
        segments[i].x = P1.x + x_diff * i;
        segments[i].y = P1.y + y_diff * i;
    }

    segments[0] = P1;
    for (size_t i = 1; i < segments.size(); ++i)
    {
        std::cout << "(" << segments[i-1].x << "," << segments[i-1].y << ") - ";
        std::cout << "(" << segments[i].x << "," << segments[i].y << ")" << std::endl;
    }
}
#包括
#包括
结构点
{
双x;
双y;
};
int main()
{
P1点;
P2点;
尺寸;
标准:cin>>P1.x>>P1.y;
std::cin>>P2.x>>P2.y;
标准:cin>>N;
std::向量段(N+1);
双x_差异=(P2.x-P1.x)/N;
双y_差异=(P2.y-P1.y)/N;
对于(size_t i=1;i