【问题标题】:Algorithm for Discretizing Line线离散化算法
【发布时间】:2017-04-05 18:01:50
【问题描述】:
对于以点(x_1, y_1)、(x_2, y_2) 为界的某些给定线,有哪些算法方法和方法可用于将这条线离散为偶数段?
在数学上,我想一个人会:
(1) 求长度,
(2)除以N个段,然后
(3) 根据这些数据计算分割点,
但我想知道是否有更好或更面向“计算机科学”的方法。
我是 CS 一年级的学生,所以我不知道自己在寻找什么,甚至不知道从哪里开始寻找。
【问题讨论】:
标签:
c++
algorithm
geometry
algebra
【解决方案1】:
不需要计算和使用长度。
您可以通过简单的线性插值找到中间点(对于 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 并在循环内使用此值
【解决方案2】:
这是一个示例,说明如何从 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;
}
}