2013-03-07 120 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