数字差分分析仪 点线图

4

我正在使用数字差分分析器(DDA)来制作一条直线,虽然我知道也许可以像我现在这样使用DrawLine,但我还是想尝试制作不同类型的线条,如虚线或点线等。我想着通过跳过下面的一些数字来制作点状线条。但我仍然找不到方法。这是我目前的代码:

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

    }

有什么想法吗?

你可以将线条颜色改为背景色,然后再“跳转”到黑色(或者你选择的其他颜色),然后再次跳转到背景色... 这样就能实现你想要的效果。但这也取决于你使用的图层以及是否有任何透明度等因素。 - mike
你可以发一张图片吗?或者,由于您需要10点声望才能这样做,您可以提供一条图片链接吗? - mike
希望这个能够正常工作。如果你在一般输出中看到了算法的斜率,请参考此链接:http://i10.photobucket.com/albums/a124/Yuuki_Hikami/DDA.png - Jurgen Feuchter
非常感谢你的帮助,但是要使用g2,我必须对我的程序进行很多更改,最终我将面临相同的问题,因为我必须找到一种在算法中实现这一点而不是使用预先制作的方法的方法。无论如何,谢谢你。 - Jurgen Feuchter
BasicStroke自2005年以来似乎已成为标准。无论如何,也许这可以帮助您http://coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2005-02/0602.html - mike
显示剩余3条评论
1个回答

1
  1. 你需要绘制线条的函数(在你的情况下,可以使用g.drawline(x0,y0,x1,y1);)。
  2. 不用担心颜色(稍后可以进行调整)
  3. 你需要定义你的图案(线条和间隔的像素大小)
  4. 例如 int pattern[]={10,-5,0} (10像素的线条,然后是5像素的空格,0表示从头开始重复)... 负值是空格 + 正值是线条
  5. 你需要“全局”状态(模式中实际索引和实际绘制的像素长度),你还可以拥有全局模式指针或将所有内容封装在类/结构中。

好的,基本思路是将任何线段分割为选定的模式,例如:

//---------------------------------------------------------------------------
// 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,l重置为零。 代码并未经过优化,因此速度相对较慢,但我希望它足够简单易懂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接