java 用点画直线问题

请问为什么36行point数组超界,帮忙改下。还有用点画直线的算法有点问题,当x2-x1>0,y1-y2<0的情况和x1-x2<0,y1-y2>0的情况画不出来,寻求算法... 请问为什么36行point数组超界,帮忙改下。还有用点画直线的算法有点问题,当x2-x1>0,y1-y2<0的情况和x1-x2<0,y1-y2>0的情况画不出来,寻求算法
import java.awt.*;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.awt.event.*;
public class TestMain1 {
public static void main(String[] args) {
FrameDraw1 fd=new FrameDraw1();
}
}
class FrameDraw1 extends Frame{
int i;
static ArrayList <Point[]> list =new ArrayList<Point[]>();

public FrameDraw1(){
init();
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);}
});
this.setBounds(20,20,400,400);
this.setVisible(true);
}
void init(){
this.addMouseListener(new Moo1(this));
}
public void paint(Graphics g){
for(int i=0;i<list.size();i++){
Point []p=(Point[])list.get(i);
int j=2;
while(p[j]!=null&&j<100){
g.fillOval(p[j].x,p[j].y,4,4);
j++;
}
}
}

}
class Moo1 extends MouseAdapter{
Point point;
Point points[]=new Point[100];
FrameDraw1 fd;
ArrayList <Point>list=new ArrayList<Point>();
public Moo1(FrameDraw1 fd){
this.fd=fd;
}
public void mousePressed(MouseEvent e){
point=(Point)e.getPoint();
points[0]=point;//points[0]放的是起点的点坐标

}
public void mouseReleased(MouseEvent e) {
point=(Point)e.getPoint();
points[1]=point;//points[1]放的是终点的点坐标
savePoint(points[0].x,points[0].y,points[1].x,points[1].y);
fd.repaint();
// FrameDraw1.list.add(list);
}
void savePoint(int x1,int y1,int x2,int y2){
int x,y,a,b,d,d1,d2;
a=y1-y2;
b=x2-x1;
x=x1;
y=y1;
point=new Point(x,y);
d=2*a+b;d1=2*a;d2=2*(a+b);
points[2]=point;
int i;
for(i=3,x=x1;x<=x2&&i<100;x++,i++){
if(d<0){y++;d+=d2;}
else{d+=d1;}
point=new Point(x,y);
points[i]=point;
}
FrameDraw1.list.add(points);

}
}
数组问题是我看错了,不讨论了。请解决主要问题,如何画出当x2-x1>0,y1-y2<0的情况和x1-x2<0,y1-y2>0的情况的直线。
展开
 我来答
0yanglirui
2010-06-16
知道答主
回答量:45
采纳率:0%
帮助的人:12.8万
展开全部
import java.awt.*;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.awt.event.*;
public class TestMain1 {
public static void main(String[] args) {
FrameDraw1 fd=new FrameDraw1();
}
}
class FrameDraw1 extends Frame{
int i;
static ArrayList <Point[]> list =new ArrayList<Point[]>();

public FrameDraw1(){
init();
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);}
});
this.setBounds(20,20,400,400);
this.setVisible(true);
}
void init(){
this.addMouseListener(new Moo1(this));
}
public void paint(Graphics g){
for(int i=0;i<list.size();i++){
Point []p=(Point[])list.get(i);
int j=2;
while(p[j]!=null&&j<100){
g.fillOval(p[j].x,p[j].y,4,4);
j++;
}
}
}

}
class Moo1 extends MouseAdapter{
Point point;
Point points[]=new Point[100];
FrameDraw1 fd;
ArrayList <Point>list=new ArrayList<Point>();
public Moo1(FrameDraw1 fd){
this.fd=fd;
}
public void mousePressed(MouseEvent e){
point=(Point)e.getPoint();
points[0]=point;//points[0]放的是起点的点坐标

}
public void mouseReleased(MouseEvent e) {
point=(Point)e.getPoint();
points[1]=point;//points[1]放的是终点的点坐标
savePoint(points[0].x,points[0].y,points[1].x,points[1].y);
fd.repaint();
// FrameDraw1.list.add(list);
}
void savePoint(int x1,int y1,int x2,int y2){
int x,y,a,b,d,d1,d2;
a=y1-y2;
b=x2-x1;
x=x1;
y=y1;
point=new Point(x,y);
d=2*a+b;d1=2*a;d2=2*(a+b);
points[2]=point;
int i;
for(i=3,x=x1;x<=x2&&i<100;x++,i++){
if(d<0){y++;d+=d2;}
else{d+=d1;}
point=new Point(x,y);
points[i]=point;
}
FrameDraw1.list.add(points);

}
}
import java.awt.*;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.awt.event.*;
public class TestMain1 {
public static void main(String[] args) {
FrameDraw1 fd=new FrameDraw1();
}
}
class FrameDraw1 extends Frame{
int i;
static ArrayList <Point[]> list =new ArrayList<Point[]>();

public FrameDraw1(){
init();
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);}
});
this.setBounds(20,20,400,400);
this.setVisible(true);
}
void init(){
this.addMouseListener(new Moo1(this));
}
public void paint(Graphics g){
for(int i=0;i<list.size();i++){
Point []p=(Point[])list.get(i);
int j=2;
while(p[j]!=null&&j<100){
g.fillOval(p[j].x,p[j].y,4,4);
j++;
}
}
}

}
class Moo1 extends MouseAdapter{
Point point;
Point points[]=new Point[100];
FrameDraw1 fd;
ArrayList <Point>list=new ArrayList<Point>();
public Moo1(FrameDraw1 fd){
this.fd=fd;
}
public void mousePressed(MouseEvent e){
point=(Point)e.getPoint();
points[0]=point;//points[0]放的是起点的点坐标

}
public void mouseReleased(MouseEvent e) {
point=(Point)e.getPoint();
points[1]=point;//points[1]放的是终点的点坐标
savePoint(points[0].x,points[0].y,points[1].x,points[1].y);
fd.repaint();
// FrameDraw1.list.add(list);
}
void savePoint(int x1,int y1,int x2,int y2){
int x,y,a,b,d,d1,d2;
a=y1-y2;
b=x2-x1;
x=x1;
y=y1;
point=new Point(x,y);
d=2*a+b;d1=2*a;d2=2*(a+b);
points[2]=point;
int i;
for(i=3,x=x1;x<=x2&&i<100;x++,i++){
if(d<0){y++;d+=d2;}
else{d+=d1;}
point=new Point(x,y);
points[i]=point;
}
FrameDraw1.list.add(points);

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pingia
2010-06-13 · TA获得超过569个赞
知道小有建树答主
回答量:697
采纳率:100%
帮助的人:770万
展开全部
while(p[j]!=null&&j<100){
g.fillOval(p[j].x,p[j].y,4,4);
j++;
}

问题就出在这里 当j = 99时 进入循环 j ++ 之后,j变为100 下次再进来while判断的时候 ,因为p的长度只有100 所以p[j]即p[100]将会数组索引超出 改成这样:j<100&&p[j]!=null 就OK

如你所说:x1-x2<0的时候绘制不出来 我倒觉得是x1 > x2的时候绘制不出来请看SavePoint里面两个语句:
x=x1;
for(i=3,x=x1;x<=x2&&i<100;x++,i++){

如果x1>x2 由语句1推出: x>x2; 那么循环条件x<=x2&&i<100便不成立 循环不会执行 因此绘制不了直线
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chenguangyin11
2010-06-20
知道答主
回答量:3
采纳率:0%
帮助的人:0
展开全部
用镜像点方法,希望对你有帮助
void drawLine(int x1,int y1,int x2,int y2){

int x,y,a=0,b=0,d,d1,d2;
int zhongx,zhongy;
if(y2-y1>0&&x2-x1>0){
a=y2-y1;
b=x2-x1;
}
else if(y2-y1<0&&x2-x1<0){
a=y1-y2;
b=x1-x2;
}
else if(y2-y1>0&&x2-x1<0){
a=y1-y2;
b=x2-x1;
}
else if(y2-y1<0&&x2-x1>0){
a=y2-y1;
b=x1-x2;
}
x=x1;
y=y1;
point=new Point(x,y);
d=2*a+b;d1=2*a;d2=2*(a+b);
points[2]=point;
int i;
for(i=3,x=x1;x<=x2&&i<100;x++,i++){
if(d<0){y++;d+=d2;}
else{d+=d1;}
if(y2-y1>0&&x2-x1>0){
zhongx=(x2-x1)/2;
zhongy=(y2-y1)/2;
}
else if(y2-y1<0&&x2-x1<0){
zhongy=(y1-y2)/2;
zhongx=(x1-x2)/2;
int t=x;
x=y;
y=t;
}
else if(y2-y1>0&&x2-x1<0){
zhongy=(y1-y2)/2;
zhongx=(x2-x1)/2;
y=zhongy-(y-zhongy);
}
else if(y2-y1<0&&x2-x1>0){
zhongy=(y2-y1)/2;
zhongx=(x1-x2)/2;
x=zhongx-(x-zhongx);
}

point=new Point(x,y);
points[i]=point;
}
GameCanvas.list66.add(points);

}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
問猪笑了冇
2010-06-13 · TA获得超过220个赞
知道答主
回答量:108
采纳率:0%
帮助的人:88万
展开全部
你声明的Point[]大小为100,试想当j=99时,条件满足,j++ 被执行.此后j值为100,p[100]肯定会出现下标越界啦.可以在j++以后判断是否跳出循环
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式