Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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
Java 获取两个像素之间的所有像素_Java_Math_Graphics_Path_Lines - Fatal编程技术网

Java 获取两个像素之间的所有像素

Java 获取两个像素之间的所有像素,java,math,graphics,path,lines,Java,Math,Graphics,Path,Lines,我正在用java编写一个小的绘画程序,我的笔被卡住了: 理论:当我拖动鼠标时,我必须用圆圈填充p(draggedX | draggedY)和P2(mouseX | mouseY)之间的圆圈。因此,我必须创建一条直线/a路径(?..),并计算其上的所有点 我试过的: double m = 0; int width = draggedX - mouseX; int height = draggedY - mouseY; if(draggedX - mouseX != 0){ m = (dra

我正在用java编写一个小的绘画程序,我的笔被卡住了:

理论:当我拖动鼠标时,我必须用圆圈填充p(draggedX | draggedY)和P2(mouseX | mouseY)之间的圆圈。因此,我必须创建一条直线/a路径(?..),并计算其上的所有点

我试过的:

double m = 0;
int width = draggedX - mouseX;
int height = draggedY - mouseY;
if(draggedX - mouseX != 0){
    m = (draggedY - mouseY) / (draggedX - mouseX);
}
if(width > 0){
    for(int i = 0; i < width; i++) {
        double x = mouseX + i;
        double y = mouseY + (m * i);
        g.fillOval((int) x, (int) y, 5, 5);
    }
}
else if(width < 0){
    for(int i = -width; i > 0; i--) {
        double x = mouseX + i;
        double y = mouseY + (m * i);
        g.fillOval((int) x, (int) y, 5, 5);
    }
}
else{
    if(height > 0){
        for(int i = 0; i < height; i++){
            g.fillOval(mouseX, (int) i + mouseY, 5, 5);
        }
    }
    else if(height < 0){
        for(int i = -height; i > 0; i--){
            g.fillOval(mouseX, (int) i + mouseY, 5, 5);
        }
    }
}
double m=0;
int width=draggedX-mouseX;
int height=draggedY-mouseY;
如果(draggedX-mouseX!=0){
m=(draggedY-mouseY)/(draggedX-mouseX);
}
如果(宽度>0){
对于(int i=0;i0;i--){
双x=mouseX+i;
双y=mouseY+(m*i);
g、 椭圆形((int)x,(int)y,5,5);
}
}
否则{
如果(高度>0){
对于(int i=0;i0;i--){
g、 圆角(mouseX,(int)i+mouseY,5,5);
}
}
}
它工作不正常。有时,奇怪的线条飞溅出来,圆圈没有画出来,就像这样:

if (abs(m) <= 1)
{
    for (int i = startX; i < endX; i++)
    {
        float y = startY + (float)i * m;
        float x = i;
        g.fillOval(x, y, 5, 5);
    }
}
else
{
    for (int i = startY; i < endY; i++)
    {
        float x = startX + (float)i / m;
        float y = i;
        g.fillOval(x, y, 5, 5);
    }
}

还有其他想法吗,如何解决?
谢谢大家!

两个整数之间的除法丢弃小数部分:例如,2/3返回0。可以使用浮点类型进行计算,以保留小数部分

double m;
m = (double) (draggedY - mouseY) / (draggedX - mouseX);

两个整数之间的除法将丢弃小数部分:例如,2/3返回0。可以使用浮点类型进行计算,以保留小数部分

double m;
m = (double) (draggedY - mouseY) / (draggedX - mouseX);

除了另一个答案所说的,如果
m
的绝对值大于或不大于1,您还需要以不同的方式绘制。如果为1或更小,则需要沿x方向迭代,并从坡度计算y。否则,您需要沿y方向迭代,并从(反向)坡度计算m。您在代码中的想法是正确的,但是它没有完全正确地实现。应该是这样的:

if (abs(m) <= 1)
{
    for (int i = startX; i < endX; i++)
    {
        float y = startY + (float)i * m;
        float x = i;
        g.fillOval(x, y, 5, 5);
    }
}
else
{
    for (int i = startY; i < endY; i++)
    {
        float x = startX + (float)i / m;
        float y = i;
        g.fillOval(x, y, 5, 5);
    }
}

if(abs(m)除了另一个答案所说的,如果
m
的绝对值大于或不大于1,你还需要做不同的绘图。如果大于或小于1,那么你需要沿x方向迭代,并根据斜率计算y。否则,你需要沿y方向迭代,并根据斜率计算m(反向)坡度。代码中的想法是正确的,但没有正确实现。应该是这样的:

if (abs(m) <= 1)
{
    for (int i = startX; i < endX; i++)
    {
        float y = startY + (float)i * m;
        float x = i;
        g.fillOval(x, y, 5, 5);
    }
}
else
{
    for (int i = startY; i < endY; i++)
    {
        float x = startX + (float)i / m;
        float y = i;
        g.fillOval(x, y, 5, 5);
    }
}

if(abs(m)Java不会为所有中间点生成事件-您可以通过在实际接收事件的每个位置绘制点来测试这一点。如果鼠标移动太快,您将错过点。这在所有绘图程序中都会发生

是在两个像素坐标之间查找整数像素的传统方法。但是您使用Java编程,并且您有更好的方法:您可以跟踪通过坐标定义的任意路径。有两种方法

旧的图形版本(g是
图形
,可能来自
paintComponent()
方法):

新的基于形状的版本(g2d是
Graphics2D
;Swing中的
Graphics
可以毫无问题地转换为
Graphics2D
):


我推荐第二个版本,因为笔划提供了更多的灵活性(线宽、破折号等)不仅仅是简单的颜色

Java不会为所有中间点生成事件-您可以通过在实际接收事件的每个位置绘制点来测试这一点。如果鼠标移动太快,您将错过点。这在所有绘图程序中都会发生

是在两个像素坐标之间查找整数像素的传统方法。但是您使用Java编程,并且您有更好的方法:您可以跟踪通过坐标定义的任意路径。有两种方法

旧的图形版本(g是
图形
,可能来自
paintComponent()
方法):

新的基于形状的版本(g2d是
Graphics2D
;Swing中的
Graphics
可以毫无问题地转换为
Graphics2D
):


我推荐第二个版本,因为笔划比简单的颜色提供了更多的灵活性(线宽、破折号等)

好的捕捉,我也在考虑这个事件,可能它没有得到所有的事件!Oouu谢谢你,这是一个错误,我想^^^我会稍后修复它,并告诉它是否解决了问题!:)@user251414:这就是为什么我要在mouseP和dragP之间画上所有的圆圈;)很好,我也在考虑这个事件,可能它没有得到所有的事件!哦,谢谢你,这是一个错误,我想^^我稍后会修复它,并告诉它是否解决了问题!:@user251414:这就是原因,为什么我要在mouseP和dragP之间画所有的圆;)我想你没读我的密码吧。如果我从mouseevent得到2个点,虽然我移动了50,但我想在这2个点之间画所有的圆。现在明白了吗?…这里有一个笔划-见。此外,您可以要求形状每X距离单位为您提供坐标(但笔划仍然是正确的方法(TM).我想你没有读过我的代码。如果我在MouseeEvent中有2个点,虽然我移动了50,但我想在这2个点之间画所有的圆。现在明白了吗?…有一个笔划-参见的示例。此外,你可以要求形状每X距离单位为你提供坐标(但笔划仍然是正确的方法(TM))。