【问题标题】:interactive curve drawing交互式曲线绘制
【发布时间】:2010-11-23 05:48:31
【问题描述】:

我有一组 x 坐标 x={0,32,64,...256} 和 y={2,6,4....},我将沿 x_y 轴绘制图形,然后拖动沿 x 轴的点 128 到 64,现在我希望点的左侧被压缩,右侧被放大。如何在 C 中重新计算图形的坐标。 任何帮助表示赞赏。这是我的代码...

int arr_x[]={32,64,96,128,160,192,224,256};
int arr_y[]={7,12,8,6,14,22,18,24};

int x1=64,x2=128; //drag x2 to x1
int min_val=abs(arr_x[0]-x2);
int idx=0;

 for (int i = 1; i < 8; i++)
        {
            if ((abs(arr_x[i] -x2)) < min_val)
            {
                min_val = abs(arr_x[i] - x2);
                idx = i;
            }
        }

 float r;//ratio for compression and enlarge

 if(x2>x1)
 {
     arr_x[idx]=x2;
     r=(float)x2/x1;

         for(int i=0;i<=idx;i++)
         {
         arr_x[i]=arr_x[i]*r;
         }

     for(int i=idx+1;i<8;i++)
     {
         arr_x[i]=arr_x[i]/r;
     }
 }
 else
 {
     arr_x[idx]=x2;
     r=(float)x1/x2;

      for(int i=0;i<=idx;i++)
         {
         arr_x[i]=arr_x[i]*r;
         }

     for(int i=idx+1;i<8;i++)
     {
         arr_x[i]=arr_x[i]/r;
     }

【问题讨论】:

  • 你已经做了什么?你目前的算法是什么?
  • @Alastair: 请在上面找到代码...
  • @Javed: C# 用于绘制图形和 C(dll) 计算坐标
  • 通过paintEvent在C# Windows窗体中绘制图形?
  • no..using zedgraph...但我不知道如何重新计算坐标

标签: c# c algorithm math


【解决方案1】:

您需要两个坐标系统以避免混淆。一个在屏幕上 (S),一个在您的轴上 (X)。两者都从 {0 ... 256}

移动一个轴点需要计算屏幕坐标。

假设您将点 X0 移动到位置 S1。

So, if X < X0 the screen coordinate for X is (X * S1/X0)

If X > X0 the screen coordinate for X is  ((256-S1)/(256-X0))*(X-X0)+S1  

在您的示例中,将 X0 替换为 128,将 S1 替换为 64。

一个例子:

之前:

之后:

HTH!

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 2013-12-14
    • 2016-05-08
    • 1970-01-01
    • 2021-05-08
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多