已经知道一个直线方程 y=ax+b,a=2,b=3;在坐标轴内画出这个方程的直线。
要求:坐标轴的范围是(300,300),画全这个范围内的直线,但不能超出这个范围。
该如何画呢~~~~2点能够确定一条直线,可是如何才能让这个直线在(300,300)范围内画全且不超出呢? 望指教
------解决方案--------------------
记得好像当初计算机图形学课上有类似的题目。
如果我没理解错的话,这应该不是个程序问题,而主要是个数学问题。
“坐标轴的范围”给定了一个区域范围,而这个区域范围有个边界(四条线段)。解题的方法就是求出直线跟这个边界的交点,应该有两个点,然后在这两点之间画一条线就对了。
------解决方案--------------------
//----------------
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;
public class MyPanel extends JPanel {
public MyPanel() {
this.setSize(400, 400);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(1.5f));
g2.translate(50, 50);
g2.draw(new Rectangle2D.Double(rect[0], rect[1], rect[2], rect[3]));
double a = -2, b = 5;
for (b = -400; b < 1000; b += 20) {
double[] twox = getBewInter(new double[] { rect[0], rect[0] + rect[2] }, new double[] { (rect[1] - b) / a, (rect[1] + rect[3] - b) / a });
if (twox != null)
g2.draw(new Line2D.Double(twox[0], a * twox[0] + b, twox[1], a * twox[1] + b));
}
}
double[] getBewInter(double[] one, double two[]) {
double[] f = { Math.min(one[0], one[1]), Math.max(one[0], one[1]) };
double[] s = { Math.min(two[0], two[1]), Math.max(two[0], two[1]) };
if (s[0] > f[1] || s[1] < f[0])
return null;
double[] ret = { (f[0] <= s[0] && s[0] <= f[1]) ? s[0] : f[0], (f[0] <= s[1] && s[1] <= f[1]) ? s[1] : f[1] };
return ret;
}
double rect[] = { 0, 0, 300, 300 };
}
图像剪切好象用得着这类算法,不过过于复杂了,最好是采用覆盖的方式,把300*300的外边用底色覆盖来得方便。