Java2D还原无限图案遇问题:中心图形无重叠,求排查
Java2D绘制图案:中心图形缺失重叠问题排查
我用Java2D还原一款无限样式图案,大部分绘制完成,但和参考图存在一处差异:参考图中心区域有4个图形重叠,我的输出中中心无重叠效果。以下是paintComponent部分代码(完整代码可提供):
public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.translate(200,200); int scale = 60, max=8, nPoints = 60, minSize = 4; for (int i = 0; i < nPoints; i++){ double t = (i/(double)nPoints*Math.PI*2); double x = (int)(Math.cos(t) * scale); double y = (int)(Math.sin(t*2) * scale); double s = minSize + max * (1 - Math.abs(y/scale)); int size = (int)(s); g2.draw(new RoundRectangle2D.Double(x-size/2, y-size/2,size,size,12,12)); } }
问题原因分析
坐标精度丢失
你在计算x和y时,用(int)强制转换截断了浮点数值。当t使得cos(t)或sin(t*2)接近0时,坐标会被直接截断为0,本该分布在中心附近的多个图形被强行合并到同一个点,反而失去了重叠效果——实际上这些图形应该在中心区域的不同位置紧密排列,视觉上形成重叠。采样点数量不足
当前nPoints=60的采样密度不够,无法生成足够多的、位置集中在中心区域的图形。参考图的4个重叠效果需要多个t值对应到中心附近的位置,过少的采样点会漏掉这些关键位置。
另外,参数方程中的sin(t*2)对应2倍周期,若参考图的4个重叠对应4倍周期,也可能需要将t*2调整为t*4,让更多点集中到中心区域。
修复方案
- 保留坐标浮点精度:去掉
x和y计算时的(int)强制转换,让图形能正确分布在中心附近:double x = Math.cos(t) * scale; double y = Math.sin(t*2) * scale; - 增加采样点数量:将
nPoints增大到100或更高,确保覆盖足够多的中心区域采样点:int nPoints = 100; - 检查参数方程匹配度:如果调整后仍无4个重叠,尝试将
sin(t*2)改为sin(t*4),匹配参考图的4倍周期特征:double y = Math.sin(t*4) * scale;
内容的提问来源于stack exchange,提问作者user29898
相关产品推荐
相关产品推荐

