You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:15:07