代码之家  ›  专栏  ›  技术社区  ›  Jeff L

将点从一个二维空间缩放到另一个二维空间

  •  0
  • Jeff L  · 技术社区  · 2 年前

    我的程序的输入是半径为100的圆的蓝色区域内的(x,y)整数坐标。我想将输入坐标从蓝色区域缩放到红色区域,保持x和y的比例。

    example (链接到Desmos绘图: https://www.desmos.com/calculator/61f4y2r7r4 )

    我知道如何用一维来做这件事- this answer 提供了有关执行线性缩放的良好概述。我试图将这种方法分别应用于x轴和y轴。下面是我为图像建模而编写的一些示例代码。

    #include <math.h>
    #include <stdio.h>
    
    #define RADIUS 100
    
    static int find_point_on_circumference(int val) {
        return sqrt(RADIUS * RADIUS - val * val);
    }
    
    static int scale(int val, int min_old, int max_old, int min_new, int max_new) {
        return (max_old == min_old)
                 ? val
                 : (((val - min_old) * (max_new - min_new)) / (max_old - min_old) + min_new);
    }
    
    int main() {
        int x = 15;
        int y = 96;
        int boundary_old_x = 10;
        int boundary_old_y = 10;
        int boundary_new_x = 30;
        int boundary_new_y = 20;
    
        int new_x = scale(
          x,
          boundary_old_x,
          find_point_on_circumference(y),
          boundary_new_x,
          find_point_on_circumference(y));
    
        int new_y = scale(
          y,
          boundary_old_y,
          find_point_on_circumference(x),
          boundary_new_y,
          find_point_on_circumference(x));
    
        if (sqrt(new_x * new_x + new_y * new_y) <= RADIUS) {
            printf("SUCCESS\n");
        } else {
            printf("FAIL\n");
        }
    
        return 0;
    }
    

    对于这个特定的输入(15,96),结果在圆之外。我可以看出原因是我的max-x界小于min-x界。我只是不确定首先应该如何正确地应用这种缩放。

    0 回复  |  直到 2 年前