C# 交互式曲线绘制

C# 交互式曲线绘制,c#,c,algorithm,math,C#,C,Algorithm,Math,我有一组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[

我有一组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;
     }
int arr_x[]={32,64,96128160192224256};
int arr_y[]={7,12,8,6,14,22,18,24};
int-x1=64,x2=128//将x2拖动到x1
int min_val=abs(arr_x[0]-x2);
int-idx=0;
对于(int i=1;i<8;i++)
{
if((abs(arr_x[i]-x2))x1)
{
arr_x[idx]=x2;
r=(浮动)x2/x1;

对于(inti=0;i您需要两个坐标系以避免混淆。一个在屏幕上,一个在轴上(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  
So,如果XX0,则X的屏幕坐标为((256-S1)/(256-X0))*(X-X0)+S1
在您的示例中,将X0替换为128,将S1替换为64

一个例子:

之前:

之后:


HTH!

您需要两个协调系统以避免混淆。一个在屏幕上,一个在轴上(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  
So,如果XX0,则X的屏幕坐标为((256-S1)/(256-X0))*(X-X0)+S1
在您的示例中,将X0替换为128,将S1替换为64

一个例子:

之前:

之后:


HTH!

您已经做了什么?您当前的算法是什么?@Alastair:请查找上面的代码…@Javed:C#用于绘制图形和C(dll)要通过paintEvent在C#Windows窗体中计算坐标绘图?不,使用zedgraph…但我不知道如何重新计算坐标您已经做了什么?您当前的算法是什么?@Alastair:请查找上面的代码…@Javed:C#用于绘图和C(dll)要通过paintEvent计算C#Windows窗体中的坐标绘图图?不…使用zedgraph…但我不知道如何重新计算坐标