画一只蜘蛛
Drawing a spider
我需要使用 Graphics 包绘制一只蜘蛛。但问题是它的大小、腿和眼睛的数量是由用户指定的。
我有几个问题:
- 如何随机 select 圆上的一个点,以便我可以从那里画一条线(用于腿),同时记住
drawLine()
,例如,只接受整数参数?
- 如何随机select圆内的一个点作为眼睛的中心,使圆(眼睛)在外圆(body)的范围内?
选择圆上的一个点只需要得到一个随机的角度。 Java 使用弧度作为它的三角函数,因此 0 和 1 之间的随机双倍乘以 2π。
Random r = new Random();
double angle = r.nextDouble() * Math.PI * 2;
画腿是简单的三角函数,需要找到每条线的 x 和 y。为此使用 sine and cosine functions。然后可以从圆的中心点绘制线 (centerX and centerY
),以指定的像素长度 (legLength
) 结束。
可以重复该过程以绘制具有指定偏移量 (legOffset
) 的多条腿,然后重复并再次偏移(按 π)以绘制另一侧的腿。
for (int i = 0; i < 4; i++) {
int lineX = (int) radius * Math.cos(angle);
int lineY = (int) radius * Math.sin(angle));
g.drawLine(circleX + lineX , circleY + lineY , circleX + lineX * legLength, circleY + lineY * legLength);
angle += legOffset;
}
画眼睛和画腿基本上是一样的过程。每只眼睛都可以以指定的角度和距圆心的距离绘制。
int eyeX = (int) distance * Math.cos(angle);
int eyeY = (int) distance * Math.sin(angle));
g.fillOval(eyeX - eyeRadius, eyeY - eyeRadius, eyeRadius* 2, eyeRadius* 2);
获取随机整数的最简单方法是创建一个 Random
的实例,使用 random.nextInt(bound)
你会得到一个介于 0(含)和边界(不含)之间的整数,[0, bound)
.
我不会select蜘蛛的左上角,而是随机select蜘蛛的中心,然后绘制与其相关的所有内容。
现在让我们定义半径 r = size / 2
。
在确保蜘蛛完全可见的情况下选择一个随机点:
x = r + random.nextInt(width - 2 * r);
y = r + random.nextInt(height - 2 * r);
绘制直径为 r
而不是 2r
的 body 以确保腿可见:g.fillOval(x - r / 2, y - r / 2, r, r);
画腿和眼睛:有很多策略,你可以从中心画出长度为 r
的线作为腿,距离 r/4
的非常小的圆圈眼睛的中心。 select初始随机角度后,您可以使用黄金角度计算下一条腿/眼睛的位置,这确保它们永远不会绘制在同一位置(https://en.wikipedia.org/wiki/Golden_angle)。
注意:先画腿,再画body,最后画眼睛。
我需要使用 Graphics 包绘制一只蜘蛛。但问题是它的大小、腿和眼睛的数量是由用户指定的。
我有几个问题:
- 如何随机 select 圆上的一个点,以便我可以从那里画一条线(用于腿),同时记住
drawLine()
,例如,只接受整数参数? - 如何随机select圆内的一个点作为眼睛的中心,使圆(眼睛)在外圆(body)的范围内?
选择圆上的一个点只需要得到一个随机的角度。 Java 使用弧度作为它的三角函数,因此 0 和 1 之间的随机双倍乘以 2π。
Random r = new Random();
double angle = r.nextDouble() * Math.PI * 2;
画腿是简单的三角函数,需要找到每条线的 x 和 y。为此使用 sine and cosine functions。然后可以从圆的中心点绘制线 (centerX and centerY
),以指定的像素长度 (legLength
) 结束。
可以重复该过程以绘制具有指定偏移量 (legOffset
) 的多条腿,然后重复并再次偏移(按 π)以绘制另一侧的腿。
for (int i = 0; i < 4; i++) {
int lineX = (int) radius * Math.cos(angle);
int lineY = (int) radius * Math.sin(angle));
g.drawLine(circleX + lineX , circleY + lineY , circleX + lineX * legLength, circleY + lineY * legLength);
angle += legOffset;
}
画眼睛和画腿基本上是一样的过程。每只眼睛都可以以指定的角度和距圆心的距离绘制。
int eyeX = (int) distance * Math.cos(angle);
int eyeY = (int) distance * Math.sin(angle));
g.fillOval(eyeX - eyeRadius, eyeY - eyeRadius, eyeRadius* 2, eyeRadius* 2);
获取随机整数的最简单方法是创建一个 Random
的实例,使用 random.nextInt(bound)
你会得到一个介于 0(含)和边界(不含)之间的整数,[0, bound)
.
我不会select蜘蛛的左上角,而是随机select蜘蛛的中心,然后绘制与其相关的所有内容。
现在让我们定义半径 r = size / 2
。
在确保蜘蛛完全可见的情况下选择一个随机点:
x = r + random.nextInt(width - 2 * r); y = r + random.nextInt(height - 2 * r);
绘制直径为
r
而不是2r
的 body 以确保腿可见:g.fillOval(x - r / 2, y - r / 2, r, r);
画腿和眼睛:有很多策略,你可以从中心画出长度为
r
的线作为腿,距离r/4
的非常小的圆圈眼睛的中心。 select初始随机角度后,您可以使用黄金角度计算下一条腿/眼睛的位置,这确保它们永远不会绘制在同一位置(https://en.wikipedia.org/wiki/Golden_angle)。
注意:先画腿,再画body,最后画眼睛。