77 pmin=((*minmax)[
"0,:"]);
78 pmax=((*minmax)[
"1,:"]);
84 int ymax=(int)((*
pmax)[1]);
85 int ymin=(int)((*
pmin)[1]);
89 step =(ymax-ymin)/((
int)ymax-(int)ymin);
90 }
else if (ymax==ymin){
91 float data[4]={(*pmin)[0],(float)ymax,(*
pmax)[0],(float)ymax};
92 矩阵* 左右点=
new 矩阵(2,2,data,1);
100 assert( ((ymax-ymin)+1)*2 ==
左右扫描点->
h );
108 for(
float y=ymin;y<ymax+1;y+=step){
109 float data[4]={(*pmin)[0],(float)y,(*
pmax)[0],(float)y};
113 bool y_in_edge_flag=((y-ymin<step) or (ymax-y<step)) or (y-ymin==0) or(ymax-y==0);
115 int y_in_point_index=-1;
116 矩阵 差=(*(*points)[
":,1"])-y;
117 float y_in_point_flag[4]={0,0,0,0};
118 for(
int 差i=0;差i<差.
h;差i++){
119 if(abs(差[差i])<step*0.5 or abs(差[差i])==0){
120 y_in_point_flag[差i]=1;
122 if((y_in_point_flag[0]+y_in_point_flag[1]==1) and 差i==2 and imax==4){imax=imax-1;}
127 矩阵 旗 =
矩阵(1,4,y_in_point_flag,1);
129 if((旗.
和())->data[0]==3){imax =
points->
h;}
130 if(旗[1]==1 and 旗[3]==1 and (旗.
和())->
data[0]==2){imin=1;}
131 矩阵 扫描线=
矩阵(2,2,(
float *)data,1);
133 for(
int i=imin;i<imax;i++){
137 ss<<i<<
":"<<i+2<<
",:";
138 边=(*points)[ss.str()];
161 矩阵* 交点2=线1.
线段交点(*边,扫描线,&被替换的序号2);
168 if( 被替换的序号2 != 线1.
Inf){
179 if(y_in_point_index==i+1){
182 if(y_in_point_index==i and i==0){
194 assert( ((ymax-ymin)+1)*2 ==
左右扫描点->
h );
202 矩阵* select_pos_return=NULL;
205 pmin=((*minmax)[
"0,:"]);
206 pmax=((*minmax)[
"1,:"]);
207 float minx=(*pmin)[0];
208 float miny=(*pmin)[1];
209 float maxx=(*pmax)[0];
210 float maxy=(*pmax)[1];
212 select_pos_return =
new 矩阵(maxy-miny+1,maxx-minx+1,0);
213 for(
int j=0;j<maxy-miny;j+=1){
214 float x1=(*左右扫描点)[0+j*4];
215 float x2=(*左右扫描点)[2+j*4];
216 float y=(*左右扫描点)[1+j*4];
224 for(
int x=x1;x<x2+1;x++){
225 select_pos_return->
data[x-(int)minx+(
int)(round(y)-miny)*select_pos_return->
w]=1;
229 return select_pos_return;
234 矩阵* select_pos_return=NULL;
237 if(*color<0){
return select_pos_return;}
244 pmin=((*minmax)[
"0,:"]);
245 pmax=((*minmax)[
"1,:"]);
246 float minx=(*pmin)[0];
247 float miny=(*pmin)[1];
248 float maxx=(*pmax)[0];
249 float maxy=(*pmax)[1];
251 select_pos_return =
new 矩阵(maxy-miny+1,maxx-minx+1,0);
255 for(
int j=0;j<maxy-miny;j+=1){
256 float x1=(*左右扫描点)[0+j*4];
257 float x2=(*左右扫描点)[2+j*4];
258 float y=(*左右扫描点)[1+j*4];
268 if(( (
int)(x1*1000)-((
int)x1)*1000)>0){
272 for(
float x=x1;x<x2;x++){
273 select_pos_return->
data[(int)x-(
int)minx+(int)(round(y)-(int)miny)*select_pos_return->
w]=1;
289 return select_pos_return;
295 float view[]={0,0,1};
296 视线=
new 矩阵(1,3,view,1);
300 矩阵 *暂时法线=(*((*vns).和(0))).
单位化();
331 float puw[]={pbx/(pax+pbx),pax/(pax+pbx)};
332 矩阵 PUW=
矩阵(1,2,puw,1);
333 矩阵* aby_=(*(*points)[
"0:2,:"])[
":,1"];
336 矩阵* puy=PUW.
点积(*aby_);
338 矩阵 上法线=*((*vns)[
"0,:"])*PUW[0]+*((*
vns)[
"1,:"])*PUW[1];
344 float pdw[]={pdx/(pcx+pdx),pcx/(pcx+pdx)};
345 矩阵 PDW=
矩阵(1,2,pdw,1);
346 矩阵* cdy_=(*(*points)[
"2:4,:"])[
":,1"];
349 矩阵* pdy=PDW.
点积(*cdy_);
351 矩阵 下法线=*((*vns)[
"2,:"])*PUW[0]+*((*
vns)[
"3,:"])*PUW[1];
354 矩阵* PUD = pdy->
c_(puy,pdy);
361 float pudw[]={pdyd/(puyd+pdyd),puyd/(puyd+pdyd)};
362 矩阵 PUDW=
矩阵(1,2,pudw,1);
364 矩阵* py=PUDW.
点积(*PUD);
366 矩阵 法线=(上法线)*PUDW[0]+(下法线)*PUDW[1];
368 float view[]={0,0,1};
372 矩阵* 暂时法线=((*vns)[
"0,:"]);
385 矩阵* select_pos_return=NULL;
388 pmin=((*minmax)[
"0,:"]);
389 pmax=((*minmax)[
"1,:"]);
404 矩阵* last_compare=NULL;
406 for(
int i=-1;i<
points->
h-1;i++){
407 stringstream ss1,ss2;
410 if(i==-1){ss2<<
points->
h-1<<
",:";}
412 矩阵 p01=*((*points)[ss1.str()])-*((*
points)[ss2.str()]);
420 矩阵 p01x = p01xy-p01xx;
426 vector<矩阵*>::iterator it;
430 矩阵 等阵= (*last_compare)==p01xz;
442 last_compare=
new 矩阵(p01xz);
449 select_pos_return =
new 矩阵(last_sp->
h,last_sp->
w,last_sp->
data,1);
451 return select_pos_return;
int * fill_color(int *img, float *color)
给图像里填充颜色,输入参数是图像指针
vector< 矩阵 * > select_pos
存储在多边形内部的点坐标
void fill_test()
测试FillPology是否建立成功,并可调用
矩阵 * get_select_pos_from_scan(矩阵 *左右扫描点)
使用光栅扫描法得到的左右点,计算多边形内点的坐标
矩阵 * fill_color(矩阵 *img, float *color)
利用光删扫描法得到的左右点,对多边形内部填充颜色
FillPology(矩阵 *多边形顶点, 矩阵 *法线=NULL, 矩阵 *view_vector=NULL, int plane_index=0)
float need_display(void)
使用
矩阵 * get_select_pos(int plane_index)
使用矩阵法计算得到多边形内部的点的坐标
int * fill_img(int *img, float *img_color, int *select_pos_z, int plane_index)
给图像里填充图像,适用于将图像插入当前图像的多边形内
int plane_index
一个三维物体有很多多边形构成,此参数为平面的序号
矩阵 * get_scan(void)
尝试光删扫描法,看会不会比矩阵求取法更快一些
矩阵 * 坐标阵[]
//! 对应python版本的Fillpology.py的 self.X,self.Y
FillPology()
建立各成员指针都为NULL的FillPology 对象
基本的矩阵计算类,用于完成各种矩阵初始化、最大最小、取值、加减乘除、精度设置等矩阵计算
矩阵 * c_(矩阵 *矩阵1, 矩阵 *矩阵2)
矩阵 * arange(int start, int end)
模仿numpy 的arange
矩阵 * r_(矩阵 *矩阵1, 矩阵 *矩阵2)
按行合并
矩阵 * minmax(void)
求矩阵中所有元素的最大值,最小值
矩阵 ** meshgrid(矩阵 *行x, 矩阵 *行y, 矩阵 **坐标阵)
模仿numpy 的meshgrid
矩阵 * 点积(矩阵 &矩阵1)
矩阵点积运算,对应位置相乘再相加
矩阵 * 单位化(void)
对矩阵的每一行,进行单位化
矩阵 * 线段交点(矩阵 &线1的两个点, 矩阵 &线2的两个点, float *被替换的序号)