2013-09-02 2 views
4

Я использую DDA (Digital Differential Analizer), чтобы сделать линию, и подумал, что я знаю, возможно, используя DrawLine так, как я, просто бегите вместе с ним. Я пытаюсь сделать разные типы линий, например пунктирные или пунктирные, и т. Д. Im, думая о том, чтобы сделать снизу, прыгать рядом, чтобы сделать пунктирную линию. Но я не могу найти способ сделать это. Это то, что у меня есть до сих пор:Цифровой аналитический анализатор пунктирной линии

public void paint(Graphics g) { 
     super.paint(g); 
     int dot=0; 
     int x1 = pointStart.x; 
     int x2 = pointEnd.x; 
     int y1 = pointStart.y; 
     int y2 = pointEnd.y; 
     float dx, dy, m, y, x; 
     if (x1>x2){ 
      int ax = x2; 
      int ay = y2; 
      x2 = x1; 
      x1 = ax; 
      y2 = y1; 
      y1 = ay; 
     } 
     dx = x2 - x1; 
     dy = y2 - y1; 
     m = dy/dx; 
     if (m>=-1&&m<=1){ 
      dot = (int)dx/4; 
      y = y1; 
      System.out.println(m); 
      for (x = x1 ; x <= x2;x++){ 
       //if (x>=dot&&x<=dot+10||x>=dot*2&&x<=dot*2+10||x>=dot*3&&x<=dot*3+10){ 
        g.drawLine((int)x, (int)Math.round(y), (int)x, (int)Math.round(y)); 
        y+=m; 
       //} 
      } 
     } 
     else{ 
      x = x1; 
      System.out.println(m); 
      for (y = y1 ; y <= y2;y++){ 
       g.drawLine((int)Math.round(x), (int)y, (int)Math.round(x), (int)y); 
       x+=1/m; 
      } 
     } 

     /*if (pointStart != null) { 
      if (x1>)   
      g.setColor(Color.RED); 
      //g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y); 
      g.drawLine(x1, y1, x1, y1); 
     }*/ 

    } 

Любые идеи?

+0

Как насчет того, чтобы вы изменили цвет линии на цвет фона, а затем снова «прыгали» на черный (или любой другой цвет, который вы выбрали), затем снова переходите к цвету фона ... таким образом, вы получаете эффект. Но это также зависит от слоев, которые вы используете, и если что-то прозрачно и т. Д. – mike

+0

Ничего себе не думал о том, что XD ty Ill попробуйте. –

+0

Добро пожаловать! – mike

ответ

1
  1. Вам нужна функция линии рисования (в вашем случае g.drawline (x0, y0, x1, y1);).
  2. не заботится о цвете (вы можете играть с ним позже)
  3. вам нужно определение вашего шаблона (размера строк и пробелов в пикселях)
  4. для примера Int шаблона [] = {10, -5,0 } (Строка 10px, затем 5px пробел, 0 означает повторение с начала) ... -значения являются пробелами + значениями являются строки
  5. вам нужно «глобальное» состояние (фактический индекс в шаблоне и фактическая длина пикселя), также вы можете глобальный указатель паттерна или инкапсулировать все в классе/структуре.

ИТАК основная идея заключается в том, чтобы segmentate любой линии к выбранному шаблону, например, так:

//--------------------------------------------------------------------------- 
// pattern draw state 
int _pattern_ix=0; // actual index in pattern need to reset it to zero before any pattern change 
double _pattern_l=0; // already drawed or skipped pixels from actual pattern[_pattern_ix] 
// predefined patterns 
int _pattern_dash_dash[]={ 10,-10,  0 }; 
int _pattern_dash_dot[] ={ 10,- 5, 1,- 5,0 }; 
int _pattern_dot_dot[] ={ 1,- 5,  0 }; 
//--------------------------------------------------------------------------- 
// draw line function 
void drawline(int x0,int y0,int x1,int y1) 
    { 
    // this is just borland GDI access to draw line function 
    Form1->Canvas->MoveTo(x0,y0); 
    Form1->Canvas->LineTo(x1,y1); 
    } 
//--------------------------------------------------------------------------- 
void pattern_line(int x0,int y0,int x1,int y1,int *pattern) 
    { 
    int p; 
    double x,y,xx,yy,dx,dy,dl,t,dt; 
    dx=x1-x0; 
    dy=y1-y0; 
    dl=sqrt((dx*dx)+(dy*dy)); 
    dx/=dl; dy/=dl; 
    for (t=0.0,dt=0.0;dl>=0.5;) 
     { 
     p=pattern[_pattern_ix]; 
     if (p<0) // skip 
      { 
      dt=-p-_pattern_l;      // t=space to skip [px] 
      if (dt>dl) { _pattern_l+=dl; return; } // space is bigger then rest of line 
      dl-=dt; t+=dt; _pattern_l=0.0;   // update line params and continue to next pattern entry 
      } 
     else  // draw 
      { 
      dt=+p-_pattern_l;      // t=space to draw [px] 
      x=x0+double(t*dx);     // actual point pos 
      y=y0+double(t*dy);     // space is bigger then rest of line 
      if (dt>dl) { _pattern_l+=dl; drawline(x,y,x1,y1); return; } 
      dl-=dt; t+=dt; _pattern_l=0.0;  // update line params 
      xx=x0+double(t*dx);     // actual point pos 
      yy=y0+double(t*dy); 
      drawline(x,y,xx,yy);     // draw line and continue to next pattern entry 
      } 
     _pattern_ix++; 
     if (!pattern[_pattern_ix]) _pattern_ix=0; 
     } 
    } 
//--------------------------------------------------------------------------- 
void main() 
    { 
    // borland GDI clear screen and color settings 
    Canvas->Brush->Color=clBlack; 
    Canvas->Pen->Color=clWhite; 
    Canvas->FillRect(ClientRect); 
    // draw dash-dot-ed rectangle 
    int x0,x1,y0,y1; 
    x0=30; x1=200; 
    y0=30; y1=100; 
    pattern_line(x0,y0,x1,y0,_pattern_dash_dot); 
    pattern_line(x1,y0,x1,y1,_pattern_dash_dot); 
    pattern_line(x1,y1,x0,y1,_pattern_dash_dot); 
    pattern_line(x0,y1,x0,y0,_pattern_dash_dot); 
    } 
//--------------------------------------------------------------------------- 

и не забудьте сбросить образец IX, л до нуля перед любым изменением стиля картины. Код не оптимизирован, поэтому он довольно медленный, но достаточно простой, чтобы понять, я надеюсь.

Смежные вопросы