计算机图形学五角星的裁剪代码
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class ClipLine extends Frame
{
public static void main(String[] args)
{new ClipLine();}
ClipLine()
{
super("Click on two opposite corners of a rectangle");
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(1000,1000);
add("Center", new CvClipLine());
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
show();
}
}
class CvClipLine extends Canvas
{
float xmin, xmax, ymin, ymax, rWidth = 20.0F, rHeight = 12.0F, pixelSize;
int maxX, maxY, centerX, centerY, np = 0;
CvClipLine()
{
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
float x = fx(evt.getX()), y = fy(evt.getY());
if(np == 2) np = 0;
if(np == 0) {xmin = x; ymin = y;}
else
{
xmax = x; ymax = y;
if(xmax < xmin)
{
float t = xmax; xmax = xmin; xmin = t;
}
if(ymax < ymin)
{
float t = ymax; ymax = ymin; ymin = t;
}
}
np++;
repaint();
}
});
}
void initgr()
{
Dimension d = getSize();
maxX = d.width - 1; maxY = d.height - 1;
pixelSize = Math.max(rWidth / maxX, rHeight / maxY);
centerX = maxX / 2; centerY = maxY / 2;
}
int iX(float x){return Math.round(centerX + x / pixelSize);}
int iY(float y){return Math.round(centerY - y / pixelSize);}
float fx(int x){return (x - centerX) * pixelSize;}
float fy(int y){return (centerY - y) * pixelSize;}
void drawLine(Graphics g, float xP, float yP, float xQ, float yQ)
{
g.drawLine(iX(xP), iY(yP), iX(xQ), iY(yQ));
}
int clipCode(float x, float y)
{
return
(x < xmin ? 8 : 0) | (x > xmax ? 4 : 0) | (y < ymin ? 2 : 0) | (y > ymax ? 1 : 0);
}
void clipLine(Graphics g, float xP, float yP, float xQ, float yQ, float xmin, float ymin, float xmax, float ymax)
{
int cP = clipCode(xP, yP), cQ = clipCode(xQ, yQ);
float dx, dy;
while((cP | cQ) != 0)
{
if((cP & cQ) != 0) return;
dx = xQ - xP; dy = yQ - yP;
if(cP != 0)
{
if ((cP & 8) == 8){ yP += (xmin - xP) * dy / dx; xP = xmin;}
else
if ((cP & 4) == 4){ yP += (xmax - xP) * dy / dx; xP = xmax;}
else
if ((cP & 2) == 2){ xP += (ymin - yP) * dx / dy; yP = ymin;}
else
if ((cP & 1) == 1){ xP += (ymax - yP) * dx / dy; yP = ymax;}
cP = clipCode(xP, yP);
}
else
if(cQ != 0)
{
if ((cQ & 8) == 8){ yQ += (xmin - xQ) * dy / dx; xQ = xmin;}
else
if ((cQ & 4) == 4){ yQ += (xmax - xQ) * dy / dx; xQ = xmax;}
else
if ((cQ & 2) == 2){ xQ += (ymin - yQ) * dx / dy; yQ = ymin;}
else
if ((cQ & 1) == 1){ xQ += (ymax - yQ) * dx / dy; yQ = ymax;}
cQ = clipCode(xQ, yQ);
}
}
drawLine(g, xP, yP, xQ, yQ);
}
public void paint(Graphics g)
{
initgr();
if(np == 1)
{
drawLine(g, fx(0), ymin, fx(maxX), ymin