Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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_Graphics_2d_Subpixel - Fatal编程技术网

Java 亚像素渲染

Java 亚像素渲染,java,graphics,2d,subpixel,Java,Graphics,2d,Subpixel,我正在尝试使用亚像素定位在Java中渲染2d形状,但失败了。失败的尝试如下所示(暂时忽略刻度和仿射变换): import java.awt.*; 导入java.awt.event.*; 导入java.awt.geom.*; 公共类TestFrame扩展了框架{ 专用静态最终整数D=64; 公共静态void main(字符串参数[]){ 新的测试框架(D,D); } 私人决赛插页; 私人最终双刻度=1; 测试帧(整数w,整数h){ ins=getInsets(); 最终尺寸标注=新尺寸(w+ins

我正在尝试使用亚像素定位在Java中渲染2d形状,但失败了。失败的尝试如下所示(暂时忽略
刻度和
仿射变换):

import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
公共类TestFrame扩展了框架{
专用静态最终整数D=64;
公共静态void main(字符串参数[]){
新的测试框架(D,D);
}
私人决赛插页;
私人最终双刻度=1;
测试帧(整数w,整数h){
ins=getInsets();
最终尺寸标注=新尺寸(w+ins.left+ins.right,h+ins.top+ins.bottom);
包装();
addWindowListener(新的WindowAdapter(){
@凌驾
公共作废窗口关闭(WindowEvent we){
处置();
}
});
设置大小(dim);
setLocationRelativeTo(空);
挫折背景(颜色:黑色);
setVisible(真);
重新油漆();
}
@凌驾
公共空间涂料(图形gfx){
超级油漆(gfx);
最终图形2d g2d=(图形2d)gfx;
g2d.setTransform(新的仿射变换(1.0/scale,0.0,0.0,1.0/scale,ins.left,ins.top));
g2d.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
g2d.设定行程(新的基本行程((浮动)刻度));
g2d.setColor(Color.WHITE);
用于(双度=0;度<90.0;度+=2.0){
最终双弧度=deg/180.0*Math.PI;
最终双x1=数学cos(rad)*D*刻度;
最终双y1=数学sin(rad)*D*刻度;
最终双x2=数学cos(rad)*(D-4.0)*标度;
最终双y2=数学sin(rad)*(D-4.0)*标度;
g2d.绘制(新线条2D.双(x1,y1,x2,y2));
}
}
}
这将产生以下输出:

这些线的间距应该是均匀的,但正如您所看到的,它们不是。我的猜测是,起点和终点被舍入到最近的像素

建议的解决方案提到使用
Line2D.Double
(我已经在做了,但显然不起作用),或者使用
仿射变换缩小比例。如果将代码示例中的
scale
变量更改为100,则会以更高的比例绘制线,然后使用变换根据建议将其缩小。这对生成的图像也没有影响


我做错了什么?

解决方案设置为渲染提示之一:

g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
引述:

笔划规格化控制提示值——几何体应保持不变,并以亚像素精度渲染


没什么,似乎是因为java的别名算法混合了舍入。。。我尝试过更改许多参数,最好的结果是更改线宽,但遗憾的是亮度下降了…实际上,只是尝试了
g2d.setRenderingHint(RenderingHints.KEY\u STROKE\u控件,RenderingHints.VALUE\u STROKE\u PURE)这似乎解决了问题。有点神秘,没试过那个!“笔划规格化控制提示值——几何体应保持不变,并以亚像素精度渲染。”您到底需要什么,还是另一个笔划规格化值?
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);