資源簡介
三種算法java實現畫線,java沒有自帶畫點函數,所以用drawline畫點,主要是圖形學算法實現。
代碼片段和文件信息
import?java.awt.*;
import?javax.swing.*;
import?java.awt.event.*;
class?DrawLinePanel1?extends?JPanel
{
?private?static?final?long?serialVersionUID?=?1L;
?private?int?startX?=?0;
?private?int?startY?=?0;
?private?int?endX?=?0;
?private?int?endY?=?0;
?public?DrawLinePanel1()?
?{
??addMouseListener(new?MouseHandler());
}
?private?class?MouseHandler?extends?MouseAdapter?
?{
??public?void?mousePressed(MouseEvent?event)?{//?鼠標按下時
???if?(event.getButton()?==?MouseEvent.BUTTON1)?
???{
????startX?=?event.getX();
????startY?=?event.getY();
???}
??}
??public?void?mouseReleased(MouseEvent?event)?{//?鼠標釋放時
???if?(event.getButton()?==?MouseEvent.BUTTON1)?
???{
?????endX=event.getX();
?????endY=event.getY();
?????Container?c?=?(Container)?event.getSource();
?????Graphics?g?=?c.getGraphics();?//get?a?graphics?context
?????g.setColor(Color.BLUE);
????
?????DDA(startXstartYendXendYg);//下面注釋的是中點畫線算法和Bresenham算法
?????
// ?????MidPoint(startXstartYendXendYg);
// ?????Bresenham(startXstartYendXendYg);
???}
???
???
???}?
??private?void?DDA(int?x0?int?y0?int?x1?int?y1Graphics?g)?
??{
?????double?dxdyk;
?????dx?=?x1-x0;dy?=?y1-y0;
?????k?=?dy/dx;
?????
? ?if(Math.abs(k)?>=?1.0)
? ?{
? ?
? ?int?y?=?0;
? ?k?=??dx/dy;
???? ?double?x?=?Math.max(x1?x0);
???? ?if(k?>=?0)
???? ?x?=?Math.min(x1?x0);
???? ?
???? ?for(y?=?Math.min(y1y0);?y?<=?Math.max(y0?y1);?y++)
?????{
???? ?g.drawLine((int)(x+0.5)?y?(int)(x+0.5)y);
?????????x?=?x+k;
?????}
????}
????else
????{
???? ?int?x?=?0;
???? ?double?y?=?Math.min(y0y1);
???? ?if(k>-1?&&?k<0)
???? ?y?=?Math.max(y0y1);
?????for(x?=?Math.min(x0x1);?x?<=?Math.max(x0x1);?x++)
?????{
???? ?g.drawLine(x?(int)(y+0.5)?x?(int)(y+0.5));
?????????y?=?y+k;
?????}
? ?}?
??}
??private?void?MidPoint(int?x0?int?y0?int?x1?int?y1Graphics?g){
??
??int?abd1d2dx?=?0y;double?k?=?0;
?????a=y0-y1;b=x1-x0;
?????k?=?(-1.0*a)/b;
?????
?????if(Math.abs(k)<=1)
?????{
???? ?if(k>=0)
???? ?{
???? ?a?=?Math.abs(y1-y0)*-1;??b?=?Math.abs(x1-x0);
?????d?=?2*a?+?b;
???? ?d1?=?2*a;?d2?=?2*(a+b);
???? ?x?=?Math.min(x0x1);?y?=?Math.min(y0y1);
???? ?g.drawLine(x?y?x?y);
???? ?while(x ???? ?{
???? ?if(d<0)
???? ? {x++;?y++;?d+=d2;}
???? ?else
???? ????{x++;d+=d1;}
???? ?g.drawLine(x?y?x?y);
???? ?}
???? ?}
???? ?else
???? ?{
???? ?//a=Math.max(y1y0)-Math.min(y1?y0);b=Math.max(x1x0)-Math.min(x1x0);
???? ?a?=?Math.abs(y1-y0);??b?=?Math.abs(x1-x0);
???? ?d=2*a-b;d2=2*a-2*b;d1=2*a;???
???? ?x?=Math.min(x1?x0);
???? ?y?=?Math.max(y1?y0);
???? ?g.drawLine(x?y?x?y);
???? ?????while?(x ???? ?????{??
???? ???? ?if?(d>0)????
???? ????? ?{
???? ???? ?x++;
???? ???? ?y--;
???? ???? ?d+=d2;
???? ???? ?}??
???? ?????????else????
???? ?????????{
評論
共有 條評論