2013-03-07 302 views
2

我尝试在Android中相交2条路径。这在第一次尝试中工作正常。当我放大绘图(canvas.scale())时,相交的形状是不美观和丑陋的。 有谁知道如何解决我的问题?Android中的2条路径的真正交集(新路径)

我喜欢用蓝色矩形相交红色方块,红色方块内。 enter image description here

我的代码,结果是unprecise绿色路口缩放时:

enter image description here

这里是我的代码:

protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 

canvas.scale(20,20); 
Paint paint1 = new Paint(); 
paint1.setColor(Color.RED); paint1.setAntiAlias(true); 
Path path=new Path(); 
path.moveTo(10, 10); path.lineTo(20, 10); path.lineTo(20, 20); path.lineTo(10, 20); path.close(); 
//canvas.drawPath(path, paint1); 
Path path2=new Path(); 
path2.moveTo(15, 10); path2.lineTo(20, 10); path2.lineTo(20, 20); path.close(); 
paint1.setColor(Color.BLUE); 
//canvas.drawPath(path2, paint1); 

Region clip = new Region(); 
    clip.set((int)0,(int)0, (int)300,(int)300); 
Region region1 = new Region(); 
region1.setPath(path, clip); 
Region region2 = new Region(); 
region2.setPath(path2, clip); 
region1.op(region2, Region.Op.INTERSECT); 

Path pnew=region1.getBoundaryPath(); 
paint1.setColor(Color.GREEN); 
canvas.drawPath(pnew, paint1); 

}

回答

1

我的解决方案如下。 在我将它们放在一起之前,我将它们放大。路口后,我缩小它们。我不知道这是否是一个好的解决方案,但它对我有用。它也很快。在我的例子中,我使用自己创建的模式(条纹)相交一个圆形路径。

Path mypath=new Path(<desiredpath to fill with a pattern>); 
    String sPatternType=cpath.getsPattern(); 

    Path pathtempforbounds=new Path(cpath.getPath()); 
    RectF rectF = new RectF(); 
    if (sPatternType.equals("1")){ 
     turnPath(pathtempforbounds, -45); 
    } 
    pathtempforbounds.computeBounds(rectF, true); 

    float ftop=rectF.top; 
    float fbottom=rectF.bottom; 
    float fleft=rectF.left; 
    float fright=rectF.right; 
    float xlength=fright-fleft; 

    Path pathpattern=new Path(); 

    float ypos=ftop; 
    float xpos=fleft; 

    float fStreifenbreite=4f; 

    while(ypos<fbottom){ 
     pathpattern.moveTo(xpos,ypos); 
     xpos=xpos+xlength; 
     pathpattern.lineTo(xpos, ypos); 
     ypos=ypos+fStreifenbreite; 
     pathpattern.lineTo(xpos, ypos); 
     xpos=xpos-xlength; 
     pathpattern.lineTo(xpos, ypos); 
     ypos=ypos-fStreifenbreite; 
     pathpattern.lineTo(xpos, ypos); 
     pathpattern.close(); 
     ypos=ypos+2*fStreifenbreite; 

    } 

    // Original vergrössern 

    scalepath(pathpattern,10); 
    scalepath(mypath,10); 

    if (sPatternType.equals("1")){ 
     Matrix mdrehen=new Matrix(); 
     RectF bounds=new RectF(); 
     pathpattern.computeBounds(bounds, true); 
     mdrehen.postRotate(45, (bounds.right + bounds.left)/2,(bounds.bottom + bounds.top)/2); 
     pathpattern.transform(mdrehen); 
    } 

    RectF rectF2 = new RectF(); 
    mypath.computeBounds(rectF2, true); 

    Region clip = new Region(); 
    clip.set((int)(rectF2.left-100f),(int)(rectF2.top -100f), (int)(rectF2.right+100f),(int)(rectF2.bottom+100f)); 
    Region region1 = new Region(); 
    region1.setPath(pathpattern, clip); 

    Region region2 = new Region(); 
    region2.setPath(mypath, clip); 

    region1.op(region2, Region.Op.INTERSECT); 


    Path pnew=region1.getBoundaryPath(); 


    scalepath(pnew, 0.1f); 
    cpath.setPathpattern(pnew); 




public void turnPath(Path p,int idegree){ 
    Matrix mdrehen=new Matrix(); 
    RectF bounds=new RectF(); 
    p.computeBounds(bounds, true); 
    mdrehen.postRotate(idegree, (bounds.right + bounds.left)/2,(bounds.bottom + bounds.top)/2); 
    p.transform(mdrehen); 
} 

public void scalepath(Path p,float fscale){ 
    Matrix mverkleinern=new Matrix(); 
    mverkleinern.preScale(fscale,fscale); 
    p.transform(mverkleinern); 
} 
+0

这是一个好主意,唯一的问题是区域交叉是如何工作的,即它是否会创建一个临时位图,在您的情况下它可能比屏幕大10倍?如果没有,我也可以使用这个解决方案来平滑边缘。真正的大问题是如何提取这个结果路径的点并保存它,我在这里试图:http://gamedev.stackexchange.com/questions/49239/converting-a-2d-curve-into-points- for-data-storage – Lumis 2013-03-09 09:52:34

+0

您的解决方案解决了我的问题。所以如果你在我上面发布的链接中发布这个答案,我会奖励你300分! – Lumis 2013-03-09 12:09:53

0

区内交汇,工会不幸的是,它会产生一个无反锯齿的路径!

取决于你想要用这个做什么,你可以添加形状相同的路径,但设置路径

myPath.setFillType(FillType.EVEN_ODD); 

这样当你画它,你可以创建一个“洞”一个形状。

+0

非常感谢你:缩放:-)当

enter image description here

enter image description here

这里我的代码看起来还是不错的。但是这没有帮助。我更了解一些关于这些修改的方法,我想:-)当用moveto,lineto等绘制路径时,会创建一个位图,这在缩放时看起来很难看。我发布我的解决方案与缩放befor交集。 – 2013-03-09 07:36:11