Digital Diferential Analizer Dotted Line

前端 未结 1 960
Happy的楠姐
Happy的楠姐 2021-01-19 16:02

Im using de DDA (Digital Diferential Analizer) to make a line, and thought I know maybe using de DrawLine the way I am, just run along with it. Im trying to make different t

1条回答
  •  时光取名叫无心
    2021-01-19 16:10

    1. you need draw line function (in your case g.drawline(x0,y0,x1,y1); ).
    2. dont care about color (you can play with it later)
    3. you need definition of your pattern (size of lines and spaces in pixels)
    4. for example int pattern[]={10,-5,0} (10px line, then 5px space, 0 means repeat from beginning) ... -values are spaces + values are lines
    5. you need 'global' state (actual index in pattern and actual pixel length drawed) also you can have global pattern pointer or encapsulate all in class/struct.

    ok so the basic idea is to segmentate any line to selected pattern for example like this:

    //---------------------------------------------------------------------------
    // 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);
        }
    //---------------------------------------------------------------------------
    

    and do not forget to reset pattern ix,l to zero before any pattern style change. Code is not optimized so its pretty slow but simple enough to understand i hope.

    0 讨论(0)
提交回复
热议问题