【问题标题】:How to draw a circle, positioning it at a double value instead of a int?如何画一个圆,将它定位在一个双精度值而不是一个整数?
【发布时间】:2012-03-10 20:40:01
【问题描述】:

基本上,我想使用 Graphics 绘制一个圆,但我不想使用整数来定位它,而是使用双精度值。

理想情况下:

g.drawOval(0.5, 0.5, 50, 50);

非常感谢任何帮助!提前致谢!

感谢所有的帮助,但我想出了一个出路,我的 dy 变量设置为 1,所以如果我想要 dx 为 dy 的一半,这是不可能的,我只是将 dy 更改为 2 并且dx 为 1!骗我!

【问题讨论】:

  • 你不能那样做。 x 和 y 值是像素位置,不能有半像素之类的东西。如果您为此函数提供 0.5,它将被截断为 0(可能需要强制转换为 int)。
  • 感谢您的快速回复!好吧,基本上我想要一个椭圆以不是 0,45 或 -45 度的角度向下移动。有没有办法做到这一点?

标签: java graphics jframe geometry shapes


【解决方案1】:

唯一有效的方法是使用Ellipse2D.Double 形状并将其传递给Graphics2D 实例的draw(Shape) 方法。为获得最佳效果,请启用抗锯齿:

public void yourDrawingMethod(Graphics gg)
{
    /* Cast it to Graphics2D */
    Graphics2D g = (Graphics2D) gg;

    /* Enable anti-aliasing and pure stroke */
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

    /* Construct a shape and draw it */
    Ellipse2D.Double shape = new Ellipse2D.Double(0.5, 0.5, 50, 50);
    g.draw(shape);
}

您也可以使用Graphics2D.fill(Shape)

【讨论】:

  • 这是在正确的轨道上,但还不够。在此处查看我的答案,包括放大图片:stackoverflow.com/a/31221395/1143274
  • @EvgeniSergeev:谢谢,我不知道,+1 :)
【解决方案2】:

如果您想要连续移动,那么最好的方法是将 x 和 y 保留在 double 变量中。随着对象移动,变量将以不同的速率递增(取决于角度),然后您可以转换为整数...

您将获得职位:
: 0
: 1
: 2
: 3
等等。

对于足够长的运动,它会显得流畅。但是位置必须是整数值,因为您受技术约束。您不能以 0.3 像素显示某些内容。你要么有像素,要么没有,你不能只有 0.3 个。

【讨论】:

  • 嗯,有点困惑,但它给了我一个想法!有没有办法将椭圆向下移动一个像素 3 下
  • 您的意思是,您不能使用 Java。亚像素精度已经存在了很长一段时间,实际上......
  • 不,在 Swing 中这是不可能的。
  • 这是一种误导,因为它是可能的,而且并不难。请参阅我对前+后图片的回答:stackoverflow.com/a/31221395/1143274 具体来说,您不能有 0.3 个像素,但您可以将像素的颜色混合为 30% 的前景色和 70% 的背景色。这个原理叫做抗锯齿(这个名字也有误导性,呵呵),如果你用放大镜看你的屏幕,你会看到很多例子。
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2017-06-08
  • 2010-09-20
相关资源
最近更新 更多