【问题标题】: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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多