如何确保绘制的对角线完全包含在矩形边界内?
问题分析
原代码直接用固定偏移量计算线条端点,当lineOffset超过矩形的宽度或高度时,端点会超出矩形边界,导致线条溢出。要解决这个问题,必须确保每条对角线的两个端点都严格落在矩形的四条边上,核心是根据直线斜率调整端点坐标,使其始终处于矩形范围内。
解决方案
针对两种对角线(左上方向和右下方向),分别检查并修正端点坐标,确保线条完全在矩形内部。以下是修改后的代码:
@Override public void paint(Graphics gr) { super.paint(gr); gr.setColor(Color.blue); int x = 100, y = 100, width = 100, height = 300; gr.fillRect(x, y, width, height); gr.setColor(Color.red); Graphics2D g2d = (Graphics2D) gr; g2d.setStroke(new BasicStroke(0.75f)); float unitHeight = 50f; int lines = (int) Math.ceil(height / unitHeight); int lineOffset = width / 5; int cellWidth = width / 3; for (int i = 1; i <= lines; ++i) { // 绘制左上区域的对角线(斜率-1) int startX1 = x + lineOffset; int startY1 = y; int endX1 = x; int endY1 = y + lineOffset; // 修正起点:超出右边界时,调整到右边界并对应修改y坐标 if (startX1 > x + width) { int delta = startX1 - (x + width); startX1 = x + width; startY1 += delta; } // 修正终点:超出下边界时,调整到下边界并对应修改x坐标 if (endY1 > y + height) { int delta = endY1 - (y + height); endY1 = y + height; endX1 += delta; } g2d.drawLine(startX1, startY1, endX1, endY1); // 绘制右下区域的对角线(斜率-1) int startX2 = x + width - lineOffset; int startY2 = y + height; int endX2 = x + width; int endY2 = y + height - lineOffset; // 修正起点:超出左边界时,调整到左边界并对应修改y坐标 if (startX2 < x) { int delta = x - startX2; startX2 = x; startY2 -= delta; } // 修正终点:超出上边界时,调整到上边界并对应修改x坐标 if (endY2 < y) { int delta = y - endY2; endY2 = y; endX2 -= delta; } g2d.drawLine(startX2, startY2, endX2, endY2); lineOffset += cellWidth; } }
关键逻辑说明
- 两种对角线的斜率均为-1,因此x和y的变化量始终相等:x每增减Δ,y对应减增Δ,以此保持直线方向不变。
- 针对每个端点,仅检查最可能超出的边界(比如左上对角线的起点只需要检查右边界,终点只需要检查下边界),减少不必要的判断。
- 修正后的端点严格落在矩形的四条边上,确保线条完全在矩形内部绘制。
Android平台适配
Android中使用Canvas和Paint实现,核心坐标计算逻辑完全一致,只需调整API调用:
- 用
Canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint)替代AWT的drawLine方法。 - 用
Paint.setStrokeWidth(float width)设置线条宽度,Paint.setColor(int color)设置线条颜色。
内容的提问来源于stack exchange,提问作者Mahmoud Ibrahim
相关产品推荐
相关产品推荐

