利用滑鼠點選繪製出三稜錐

2022-03-16 00:31:25 字數 4524 閱讀 5488

出處:http:

大家寫文都不容易,請尊重勞動成果~ 這裡謝謝大家啦(*/ω\*)

這兩篇有相同的地方。

要求:

使用滑鼠左鍵,按下,再抬起,連續3次繪製出三稜錐的地面,再按下左鍵抬起繪製出三稜錐的頂點,並繪製出三稜錐。(利用背面檢測法)

思路:

//

3v_point三維點

class

point_3v

point_3v(

double a,double b,double

c) point_3v(

double

a,cpoint p)

point_3v(cpoint p,

double

a)

void set_point(double a,double b,double

c)

void

set_point(point_3v p)

void set_point(point_3v *p)

//投影乙個三維點,返回投影點

cpoint reflect_point_3v(point_3v v,cpoint move)

};//

二維線class

line_2v

line_2v(cpoint x,cpoint y )

void fill(cdc *p)

void fill_cclientdc(cclientdc *p)

};//

基於點填充線(不會開闢新空間)

class line :public

point_3v

line(line *p)

//三維線投影

line_2v reflect_line(point_3v v,cpoint move,bool draw,cdc *p)

//三維線投影

line_2v reflect_line_cclientdc(point_3v v,cpoint move,bool draw,cclientdc *p)

void set_line(int s_x,int s_y,int s_z,int e_x,int e_y,int

e_z)

void

set_line(point_3v s,point_3v e)

};class

face_2v

face_2v(line_2v i,line_2v j,line_2v k )

void b(int x,int y,int c1_fill,int c2,cdc *p)

}void b_cclientdc(int x,int y,int c1_fill,int c2,cclientdc *p)

}void fill(int c1_fill,int c2,cdc *p)

void fill_cclientdc(int c1_fill,int c2,cclientdc *p)

};//

基於點填充面(不會開闢新空間)

class face :public

line

face(point_3v *q[3

]) face(point_3v a,point_3v b,point_3v c,point_3v d)

face( face *p1)

void set_point(point_3v q[3

]) }

void set_face(point_3v q[3

]) l1->set_line(p[0],p[1

]); l2.set_line(p[

1],p[2

]); l3.set_line(p[

2],p[3

]); }

void

set_face(point_3v q1,point_3v q2,point_3v q3)

//三維向量的向量積

point_3v xiangliangji( point_3v a ,point_3v b)

//三維向量的點乘

double

diancheng( point_3v a ,point_3v b)

//求乙個面的法向量,輸入乙個面按逆時針方向的所有點的陣列

point_3v n( face *one_face)

else

}//判斷乙個面是否可見,如果乙個面可見,則這個面上的四個點也可見

bool view_face(face *one_face, point_3v v)

return

true

; }

else

}//3v面投影

void reflect_face(point_3v v,cpoint move,bool draw_line,bool fill_face,int c1_fill,int c2,cdc *p)}}

//3v面投影

void reflect_face_cclientdc(point_3v v,cpoint move,bool draw_line,bool fill_face,int c1_fill,int c2,cclientdc *p)}}

};//

多邊形 p+f-l=2

class

cube

cube(

int point_nums,int line_nums,int

face_nums)

else

}void set_point(point_3v *point)

}void set_cube(point_3v *point)

void reflect_cube(point_3v v,cpoint move,bool draw_line,bool fill_face,int *c1_fill,int c2,cdc *p)

void reflect_cube_cclientdc(point_3v v,cpoint move,bool draw_line,bool fill_face,int *c1_fill,int c2,cclientdc *p)

void fill( int

p) break; //

已知其它兩個,求點

case

1:break;//

已知其它兩個,求線

case

2:break;//

已知其它兩個,求面

} }

};

定義全域性變數:

//

判斷滑鼠左鍵次數

int count=0

;

//滑鼠左鍵的點

cpoint start,end;

//臨時面

face di;

//點point_3v p[4

];

//偏移量

cpoint move;

//視點

point_3v v(1,1.2,1

);

//顏色

int color[4]=;

//cube

int point_num=4,face_num=6,line_num=4

; cube cb(point_num,face_num,line_num);

滑鼠事件:

void

cmy3view::onlbuttondown(uint nflags, cpoint point)

}void

cmy3view::onlbuttonup(uint nflags, cpoint point)

break

;

case1:

break

;

case2:

break

;

case3:

break

; }

count++;

}

實驗結果:

(1)實驗總結:

l  這個程式的實現主要使用同第一題一樣的思路,只是將立方體換成了三稜錐。

l  對這個三稜錐的資料的填充主要是靠滑鼠的點選來獲取,由於三稜錐只有4個點所以使用了count來計數,當其達到4時歸零,重新計數。使用switch語句實現,當count的數不同時執行不同的語句。count=1、2計數,count=3,判斷底面是否可見並畫線,count=4,進行整個三稜錐的投影。

程式的不足:

)。補充:

獲取滑鼠點選事件

設定觸控模式 node settouchmode cc.touch mode one by one 單點觸控 或者 node settouchmode cc.touch mode all at once 多點觸控 是否啟用觸控 預設值 false node settouchenabled true ...

模擬滑鼠點選事件

今天上12306購票,可被氣得不輕,首先登陸人數受到了限制,其次買到票還有個排隊等待神馬的,先不說裡頭有沒有貓膩,電腦直接操作的,需要等待30分鐘以上嗎?神馬查詢語言要執行30分鐘才能得到個結果出來?贊同網上的言論 相比較而言,之前的搶票更能接受一些 上面是tackbar,用於隨時調整點選的時間間隔...

MFC模擬滑鼠點選

mfc 工程 把以下 放到你想要響應的函式裡面就行 cpoint pt getcursorpos pt 獲取滑鼠在螢幕的當前位置 setcursorpos 100,200 移動到某點座標 mouse event mouseeventf rightdown,0,0,0,0 點下右鍵 mouse eve...