From 50226ed4eb07d453925dbeb51db01f7b4add1ff3 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 2 Mar 2014 19:00:10 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20clip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/graphics/Clip.java | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/com/annimon/graphics/Clip.java b/src/com/annimon/graphics/Clip.java index e7a6d37..534166c 100644 --- a/src/com/annimon/graphics/Clip.java +++ b/src/com/annimon/graphics/Clip.java @@ -24,6 +24,50 @@ public class Clip extends Rect { return y + height; } + public double[] clip(double x1, double y1, double x2, double y2) { + int c1 = getClipCode(x1, y1); + int c2 = getClipCode(x2, y2); + while (c1 != 0 || (c2 != 0)) { + if (c1 == 0 && c2 == 0) { + return new double[] { x1, y1, x2, y2 }; + } + double dx = x2 - x1; + double dy = y2 - y1; + if (c1 != 0) { + if (x1 < x) { + y1 += dy * (x - x1) / dx; + x1 = x; + } else if (x1 > getXMax()) { + y1 += dy * (getXMax() - x1) / dx; + x1 = getXMax(); + } else if (y1 < y) { + x1 += dx * (y - y1) / dy; + y1 = y; + } else if (y1 > getYMax()) { + x1 += dx * (getYMax() - y1) / dy; + y1 = getYMax(); + } + c1 = getClipCode(x1, y1); + } else if (c2 != 0) { + if (x2 < x) { + y2 += dy * (x - x2) / dx; + x2 = x; + } else if (x2 > getXMax()) { + y2 += dy * (getXMax() - x2) / dx; + x2 = getXMax(); + } else if (y2 < y) { + x2 += dx * (y - y2) / dy; + y2 = y; + } else if (y2 > getYMax()) { + x2 += dx * (getYMax() - y2) / dy; + y2 = getYMax(); + } + c2 = getClipCode(x2, y2); + } + } + return new double[] { x1, y1, x2, y2 }; + } + public int getClipCode(double x, double y) { int xmin = (x < super.x) ? 1 : 0; int xmax = (x > getXMax()) ? 1 : 0;