作者 主题: 我想画一个连续的线段  (阅读 5904 次)

processinglearner

  • Newbie
  • *
  • 帖子: 9
我想画一个连续的线段
« 于: 九月 22, 2011, 02:24:43 下午 »
第一次点击鼠标 就是一个点   第二次点击鼠标 就连成了线  第三次点击 就和第二个点连线  第四次点击就和第三点连线 r清屏
画线是用midpoint 中点线算法。 不能用line。
我写的函数应该没有错把。

程序代码
void setup()
{
  size(800,800);
  background(255,255,0);

}
  void draw( int x1,int y1,int x,int y,int i)
{

  if(keyPressed==true)
    {
       if(key=='r')
     {
          background(255,0,255);
      }
    }
   

   for(i=1;i>0;i++)
   {
      if(mousePressed)
      {
         if(i==1)
         {
              stroke(255,0,0);
              point(mouseX,mouseY);

              x1=mouseX;
              y1=mouseY;
         }
         else if(i>1)
        {

            stroke(0,255,0);
            point(mouseX,mouseY);

             x=mouseX;
             y=mouseY;
            MidpointLine(x1,y1,x,y);
            x1=x;
            y1=y;
        }   //i
     }  // if mousereleased
   }//for
}

 
 

void MidpointLine(int x0,int y0,int x11, int y11)
{
  int dx=x11-x0;
  int dy=y11-y0;
  int d=2*dy-dx;
  int incrE=2*dy;
  int incrNE=2*(dy-dx);
  int x=x0,y=y0;
  stroke(0,0,255);
  point(x,y);

 
  while(x<x11)
  {
     if(d<=0)
    {
       d+=incrE;
       x=x+1;
    }
    else
    {
      d+=incrNE;
      x=x+1;
      y=y+1;
     }
    point(x,y);
  }// while
}//Midpointline


大家看看怎么改啊
« 最后编辑时间: 九月 22, 2011, 02:46:21 下午 作者 vinjn »

processinglearner

  • Newbie
  • *
  • 帖子: 9
画线,只能用 我写的midpoint 函数来画,不可以用line来画。

vinjn

  • SuperManager
  • Hero Member
  • *****
  • 帖子: 586
Re: 我想画一个连续的线段
« 回复 #2 于: 九月 22, 2011, 02:53:11 下午 »
你的代码错误很多
void draw()是不加参数的
MidpointLine的实现也是错误的

程序代码

int px = -1, py=-1;

void setup()
{
  size(800, 800);
  stroke(0);
}

void mouseReleased()
{
  if (px == -1)
  {
    px = mouseX;
    py = mouseY;
  }
  else
  {
    line(px, py, mouseX, mouseY);
    //MidpointLine(px, py, mouseX, mouseY);
    px = mouseX;
    py = mouseY;
  }
}

void draw()
{
  if (keyPressed==true)
  {
    if (key=='r')
    {
      background(255, 0, 255);
    }
  }
}




void MidpointLine(int x0, int y0, int x11, int y11)
{
  int dx=x11-x0;
  int dy=y11-y0;
  int d=2*dy-dx;
  int incrE=2*dy;
  int incrNE=2*(dy-dx);
  int x=x0, y=y0;
  stroke(0, 0, 255);
  point(x, y);


  while (x<x11)
  {
    if (d<=0)
    {
      d+=incrE;
      x=x+1;
    }
    else
    {
      d+=incrNE;
      x=x+1;
      y=y+1;
    }
    point(x, y);
  }// while
}//Midpointline


processinglearner

  • Newbie
  • *
  • 帖子: 9
Re: 我想画一个连续的线段
« 回复 #3 于: 九月 23, 2011, 04:19:56 上午 »
你好,我重新改了 midpoint的函数 还是不行哇

int px = -1, py=-1;

void setup()
{
  size(800, 800);
  background(0);
  //stroke(255);
}

void mouseReleased()
{
  if (px == -1)
  {
    px = mouseX;
    py = mouseY;
  }
  else
  {
   // line(px, py, mouseX, mouseY);
    MidpointLine(px, py, mouseX, mouseY);
    stroke(255);
    line(40,40,80,80);
    px = mouseX;
    py = mouseY;
  }
}

void draw()
{
  if (keyPressed==true)
  {
    if (key=='r')
    {
      background(0);
      px=-1;
    }
  }
}

void MidpointLine(int x0,int y0, int xn,int yn)
{
  point(x0,y0);
  int dy=yn-y0;
  int dx=xn-x0;
  int x=x0;
  int y=y0;
 int d=dy/dx;
  while(x0<xn&&y0<=yn&&dy/dx>=0&&dy/dx<1)
  {
    if(d>((y+1/2-y0)/(x+1-x0)))
    {
    x=x+1;
    y=y+1;
    stroke(255);
    point(x,y);
    line(400,400,400,800);
    }
    else
    {
      x=x+1;
      stroke(255);
      point(x,y);
      line(400,400,400,700);
    }
  }
    while(x0<=xn&&y0<yn&&dy/dx>=1)
  {
    if(d>((y+1-y0)/(x+1/2-x0)))
    {
   
    y=y+1;
    stroke(255);
    point(x,y);
    line(400,400,400,800);
    }
    else
    {
      x=x+1;
      y=y+1;
      stroke(255);
      point(x,y);
      line(400,400,400,700);
    }
  }
    while(x0>=xn&&y0<yn&&dy/dx<-1)
  {
    if(d<((y+1-y0)/(x-1/2-x0)))
    {
 
    y=y+1;
    stroke(255);
    point(x,y);
    line(400,400,400,800);
    }
    else
    {
      x=x-1;
      y=y+1;
      stroke(255);
      point(x,y);
      line(400,400,400,700);
    }
  }
   while(x0>xn&&y0<yn&&dy/dx>=-1&&dy/dx<0)
  {
    if(d<((y+1/2-y0)/(x-1-x0)))
    {
    x=x-1;
    y=y+1;
    stroke(255);
    point(x,y);
    line(400,400,400,800);
    }
    else
    {
      x=x-1;

      stroke(255);
      point(x,y);
      line(400,400,400,700);
    }
  }
 
   while(x0>xn&&y0>=yn&&dy/dx>=0&&dy/dx<1)
  {
    if(d<((y-1/2-y0)/(x-1-x0)))
    {
    x=x-1;
 
    stroke(255);
    point(x,y);
    line(400,400,400,800);
    }
    else
    {
      x=x-1;
      y=y-1;

      stroke(255);
      point(x,y);
      line(400,400,400,700);
    }
  }
   while(x0>xn&&y0<yn&&dy/dx>=1)
  {
    if(d<((y-1-y0)/(x-1/2-x0)))
    {
    x=x-1;
    y=y-1;
    stroke(255);
    point(x,y);
    line(400,400,400,800);
    }
    else
    {
      y=y-1;

      stroke(255);
      point(x,y);
      line(400,400,400,700);
    }
  }
   while(x0<=xn&&y0>yn&&dy/dx<-1)
  {
    if(d<((y-1-y0)/(x+1/2-x0)))
    {
 
    y=y-1;
    stroke(255);
    point(x,y);
    line(400,400,400,800);
    }
    else
    {
      x=x+1;
      y=y-1;

      stroke(255);
      point(x,y);
      line(400,400,400,700);
    }
  }
 
   while(x0<xn&&y0>yn&&dy/dx>=-1&&dy/dx<0)
  {
    if(d<((y-1/2-y0)/(x+1-x0)))
    {
    x=x+1;
    y=y-1;
    stroke(255);
    point(x,y);
    line(400,400,400,800);
    }
    else
    {
      x=x+1;

      stroke(255);
      point(x,y);
      line(400,400,400,700);
    }
  }
}

processinglearner

  • Newbie
  • *
  • 帖子: 9
Re: 我想画一个连续的线段
« 回复 #4 于: 九月 23, 2011, 04:21:22 上午 »
一共分为8种情况 每个象限2中情况,不知道什么问题

vinjn

  • SuperManager
  • Hero Member
  • *****
  • 帖子: 586
Re: 我想画一个连续的线段
« 回复 #5 于: 九月 23, 2011, 01:40:43 下午 »
while不是这样子用的,在while循环内多用println输出点调试信息吧
要对函数/循环的生死有认识
画一根线只有一种情况,不应该有8个while

processinglearner

  • Newbie
  • *
  • 帖子: 9
Re: 我想画一个连续的线段
« 回复 #6 于: 九月 23, 2011, 01:47:41 下午 »
 :-[能否在具体一些呢。
我是画的一条线,只是分为3种情况考虑。
比如第一象限 斜率大于一 小于一  第二象限 一次类推下去。

vinjn

  • SuperManager
  • Hero Member
  • *****
  • 帖子: 586

Tags: