出處: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...