Java 获取两个像素之间的所有像素
我正在用java编写一个小的绘画程序,我的笔被卡住了: 理论:当我拖动鼠标时,我必须用圆圈填充p(draggedX | draggedY)和P2(mouseX | mouseY)之间的圆圈。因此,我必须创建一条直线/a路径(?..),并计算其上的所有点 我试过的: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
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))。