| 619 | } |
| 620 | |
| 621 | int PCSeg::CorrectPoints(float *fPoints,int pointNum,float *gndPos) |
| 622 | { |
| 623 | float RTM[9]; |
| 624 | float gndHeight=0; |
| 625 | float znorm[3]={0,0,1}; |
| 626 | float tmp[3]; |
| 627 | |
| 628 | GetRTMatrix(RTM,gndPos,znorm); // RTM 由当前地面法向量gnd,将平面转到以(0,0,1)为法向量的平面 sy |
| 629 | |
| 630 | gndHeight = RTM[2]*gndPos[3]+RTM[5]*gndPos[4]+RTM[8]*gndPos[5]; |
| 631 | |
| 632 | for(int pid=0;pid<pointNum;pid++) |
| 633 | { |
| 634 | tmp[0]=RTM[0]*fPoints[pid*4]+RTM[3]*fPoints[pid*4+1]+RTM[6]*fPoints[pid*4+2]; |
| 635 | tmp[1]=RTM[1]*fPoints[pid*4]+RTM[4]*fPoints[pid*4+1]+RTM[7]*fPoints[pid*4+2]; |
| 636 | tmp[2]=RTM[2]*fPoints[pid*4]+RTM[5]*fPoints[pid*4+1]+RTM[8]*fPoints[pid*4+2]-gndHeight; //将地面高度变换到0 sy |
| 637 | |
| 638 | fPoints[pid*4]=tmp[0]; |
| 639 | fPoints[pid*4+1]=tmp[1]; |
| 640 | fPoints[pid*4+2]=tmp[2]; |
| 641 | } |
| 642 | |
| 643 | return 0; |
| 644 | } |
| 645 | |
| 646 | int AbvGndSeg(int *pLabel, float *fPoints, int pointNum) |
| 647 | { |