gpt4 book ai didi

android - android中两条路径的真实交集(新路径)

转载 作者:行者123 更新时间:2023-11-29 01:55:46 26 4
gpt4 key购买 nike

我尝试在 Android 中交叉 2 条路径。这在第一次尝试时效果很好。当我放大绘图 ( canvas.scale() ) 时,相交的形状不精确且难看。有谁知道如何解决我的问题?

我喜欢将红色方 block 与位于红色方 block 内部的蓝色矩形相交。 enter image description here

使用我的代码,结果是缩放时不精确的绿色交叉点:

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

最佳答案

我的解决方案如下。在我与我的路径相交之前,我将它们放大。交叉点后我按比例缩小。我不知道这是否是一个好的解决方案,但它对我有用。它也很快。在我的示例中,我将圆形路径与自己创建的图案(条纹)相交。缩放时它看起来仍然不错:-)

enter image description here

enter image description here

这是我的代码:

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

关于android - android中两条路径的真实交集(新路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15268300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com