Java Swing循环绘制等间距水平线适配菱形边线的实现问题
你当前代码的问题出在两点:
- 仅处理了高度下半部分的线段绘制,且线段右端点写死为
width/2,没有根据菱形边线的坐标规则动态计算 - 没有覆盖上半部分菱形区域的线段绘制
调整逻辑
菱形四条边的坐标满足线性对应关系,我们可以针对每个等距的y坐标,计算出当前y位置下水平线段在菱形左右边界上的x坐标,再基于这两个坐标画线,就能保证线段完全在菱形内部:
- 当y ≤ 高度的1/2(菱形上半区):左边界x =
(半宽) * (半高 - y) / 半高,右边界x = 总宽度 - 左边界x - 当y > 高度的1/2(菱形下半区):左边界x =
(半宽) * (y - 半高) / 半高,右边界x = 总宽度 - 左边界x
修改后完整代码
import java.awt.Graphics; import javax.swing.JPanel; public class DrawPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); int width = getWidth(); int height = getHeight(); // 等距分段数,可自行调整 int pieces = 5; int halfHeight = height / 2; int halfWidth = width / 2; // 绘制菱形四条边 g.drawLine(0, halfHeight, halfWidth, 0); g.drawLine(halfWidth, 0, width, halfHeight); g.drawLine(0, height, halfWidth, halfHeight); g.drawLine(halfWidth, halfHeight, width, height); // 绘制等距水平线段 for (int i = 1; i < pieces; i++) { int y = height * i / pieces; int leftX; // 计算当前y对应的左边界x坐标 if (y <= halfHeight) { leftX = (int) (halfWidth * (halfHeight - y) * 1.0 / halfHeight); } else { leftX = (int) (halfWidth * (y - halfHeight) * 1.0 / halfHeight); } // 右边界x坐标和左边界对称 int rightX = width - leftX; g.drawLine(leftX, y, rightX, y); } } }
改动说明
- 预先提取了半高
halfHeight、半宽halfWidth变量,简化计算逻辑 - 循环中根据y值所在的上下半区,动态计算水平线段的左右端点坐标
- 循环从
i=1开始,避免和菱形的上下边线重合,若需要包含边线可改回i=0 - 计算坐标时乘以
1.0转浮点数运算,避免整数截断带来的误差
内容的提问来源于stack exchange,提问作者fxoneend
相关产品推荐
相关产品推荐

