Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在awt java中绘制不规则形状并用颜色填充_Java_Awt_Shape_Curve - Fatal编程技术网

在awt java中绘制不规则形状并用颜色填充

在awt java中绘制不规则形状并用颜色填充,java,awt,shape,curve,Java,Awt,Shape,Curve,我正在开发一个应用程序,它在画布上绘制各种形状,并用颜色填充它们;只是一个使用java的绘画应用程序。我已经实现了矩形选择和填充形状。我更想要的是,画一个不规则的形状,即带有一些曲面的形状,并用颜色填充它 绘制形状的基本流程是:;首先,使用鼠标绘制轮廓,一旦路径闭合,可以通过拖动端点来调整形状的大小。然后,单击“完成”按钮后,可以用默认颜色(灰色)填充 关于曲面,我成功地用曲面绘制了轮廓,尽管存在一些缺陷。现在,单击“完成”按钮后,将绘制不需要的形状。实际上,我想用颜色填充轮廓的内部,不管轮廓看

我正在开发一个应用程序,它在画布上绘制各种形状,并用颜色填充它们;只是一个使用java的绘画应用程序。我已经实现了矩形选择和填充形状。我更想要的是,画一个不规则的形状,即带有一些曲面的形状,并用颜色填充它

绘制形状的基本流程是:;首先,使用鼠标绘制轮廓,一旦路径闭合,可以通过拖动端点来调整形状的大小。然后,单击“完成”按钮后,可以用默认颜色(灰色)填充

关于曲面,我成功地用曲面绘制了轮廓,尽管存在一些缺陷。现在,单击“完成”按钮后,将绘制不需要的形状。实际上,我想用颜色填充轮廓的内部,不管轮廓看起来如何

借助控制点绘制曲线的代码

public static Path2D.Double createPathWithCurve(ArrayList<EndPointRect> endPoints, ArrayList<MidPointRect> midPoints, MidPointRect midPoint, Point curPoint) {
    Path2D.Double path = new Path2D.Double();

    Point start = midPoint.getStart();
    Point end = midPoint.getEnd();
    int x[] = Utility.fetchArrayOfXFromPoint(endPoints);
    int y[] = Utility.fetchArrayOfYFromPoint(endPoints);

    for(int i = 0; i < x.length; i++) {
        MidPointRect mp = hasCurve(new Point(x[i], y[i]), midPoints);

        if(i == 0) {
            path.moveTo(x[i], y[i]); // Moves drawer to first point
            if(x[i] == start.getX() && y[i] == start.getY()) {
                path.curveTo(start.getX(), start.getY(),
                        curPoint.getX(), curPoint.getY(),
                        end.getX(), end.getY());
                midPoint.setXy(curPoint);
                midPoint.setControlPoint(curPoint);
            }
            else if(mp != null)
                path.curveTo(mp.getStart().getX(), mp.getStart().getY(),
                        mp.getControlPoint().getX(), mp.getControlPoint().getY(),
                        mp.getEnd().getX(), mp.getEnd().getY());
        }
        else if(x[i] == start.getX() && y[i] == start.getY()) {
            path.lineTo(x[i], y[i]);
            path.moveTo(start.getX(), start.getY());
            path.curveTo(start.getX(), start.getY(),
                    curPoint.getX(), curPoint.getY(),
                    end.getX(), end.getY());
            path.moveTo(end.getX(), end.getY());
            midPoint.setXy(curPoint);
            midPoint.setControlPoint(curPoint);
        }
        else {
            if(mp != null) {
                path.lineTo(x[i], y[i]);
                path.moveTo(mp.getStart().getX(), mp.getStart().getY());
                path.curveTo(mp.getStart().getX(), mp.getStart().getY(),
                        mp.getControlPoint().getX(), mp.getControlPoint().getY(),
                        mp.getEnd().getX(), mp.getEnd().getY());
                path.moveTo(mp.getEnd().getX(), mp.getEnd().getY());
            }
            else
                path.lineTo(x[i], y[i]);
        }

        if((i+1) == x.length) {
            path.lineTo(x[0], y[0]);  // Draws line from last point to first point
            //path.closePath();
        }
    }

    return path;
}
public static Path2D.Double createPathWithCurve(ArrayList端点、ArrayList中点、中点Rect中点、点curPoint){
Path2D.Double path=新的Path2D.Double();
点开始=中点。getStart();
点端点=中点。getEnd();
int x[]=Utility.fetchArrayOfXFromPoint(端点);
int y[]=Utility.fetchArrayOfYFromPoint(端点);
对于(int i=0;i
“完成”按钮单击方法和自定义曲线类:

public void doneButtonCalled() {
if (!tempRectList.isEmpty()) {
    CustomCurve area = createCurveFromPoints(getCurrentShape(), getTempRectList());
    repaint();
} }

public CustomCurve createCurveFromPoints(Path2D.Double shape, ArrayList<EndPointRect> points) {
int x[] = Utility.fetchArrayOfXFromPoint(points);
int y[] = Utility.fetchArrayOfYFromPoint(points);

return new CustomCurve(shape, x, y, x.length); }

public class CustomCurve extends Area implements ShapeModel, Serializable {
private Color color;
private int[] xPoints;
private int[] yPoints;
private boolean visible;

public CustomCurve(Path2D.Double shape, int[] xPoints, int[] yPoints, int nPoints) {
    super(shape);
    this.xPoints = xPoints;
    this.yPoints = yPoints;
    this.color = Color.darkGray;
    visible = true;
}

/* setters and getters */  }
public void doneButtonCalled(){
如果(!tempRectList.isEmpty()){
CustomCurve area=createCurveFromPoints(getCurrentShape(),getTempRectList());
重新油漆();
} }
公共自定义曲线createCurveFromPoints(路径2D.Double形状,阵列列表点){
int x[]=Utility.fetchArrayOfXFromPoint(点);
int y[]=Utility.fetchArrayOfYFromPoint(点);
返回新的自定义曲线(形状,x,y,x.length);}
公共类CustomCurve扩展区域实现ShapeModel,可序列化{
私人色彩;
私有int[]xPoints;
私人积分[]分;
私有布尔可见;
公共自定义曲线(路径2D.Double shape,int[]xPoints,int[]yPoints,int-nPoints){
超级(形状);
this.xPoints=xPoints;
this.yPoints=yPoints;
this.color=color.darkGray;
可见=真实;
}
/*setter和getter*/}

1)要更快地获得更好的帮助,请发布或。2) 例如,获取图像的一种方法是热链接到中看到的图像。但是,尽管如此,我不认为为了证明问题的存在确实需要图像,可以通过在面板中创建形状来复制图像。非常感谢@AndrewThompson,我应该事先研究该标准。这件事真让我烦透了。如果仍然不符合标准,请建议我。“如果仍然不符合标准,请建议我。”它比以往任何时候都不完整或不完整!我不是建议删除代码之外的图像和解释。你是否阅读了两个链接的文档?是的,我研究了你提供的链接,但是,我无法正确理解关于热链接的第二个链接。我指的是第一条评论中的两个链接,而不是第二条评论中关于图像的页面链接。鉴于上面剩下的不可编译代码片段既不是MCVE也不是SSCCE(基本上用不同的词描述了相同的东西),我只能断定您完全误解了它们!我写了一个,还有另一个的初稿,所以如果文件中有什么你不理解的地方,现在是问的好时机。但请具体说明你不明白的地方。