📄 pdfdocengine_crosssections.cpp
字号:
fX = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * 4 + (VOLUMES_TABLE_COLUMN_WIDTH) / 2.;
Draw_Text(fX, fY, SG_Get_String(fDist,0).c_str(), 10, PDF_STYLE_TEXT_ALIGN_H_CENTER);
fVolume = (pProfile[i].x - pProfile[i-1].x) * (fIn + fInPrev) / 2.;
fX = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * 5 + (VOLUMES_TABLE_COLUMN_WIDTH) / 2.;
Draw_Text(fX, fY, SG_Get_String(fVolume,0).c_str(), 10, PDF_STYLE_TEXT_ALIGN_H_CENTER);
fVolume = (pProfile[i].x - pProfile[i-1].x) * (fOut + fOutPrev) / 2.;
fX = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * 6 + (VOLUMES_TABLE_COLUMN_WIDTH) / 2.;
Draw_Text(fX, fY, SG_Get_String(fVolume,0).c_str(), 10, PDF_STYLE_TEXT_ALIGN_H_CENTER);
}//if
fInPrev = fIn;
fOutPrev = fOut;
iRowsWritten++;
}//for
}//Method
void CPDFDocEngine_CrossSections::AdjustSections(TSG_Point * pCrossSection,
TSG_Point * pRoadSection,
std::vector<TSG_Point > &ModifiedCrossSection,
std::vector<TSG_Point > &ModifiedRoadSection,
float fHeight,
int &iCrossSectionPoints,
int &iRoadPoints){
bool bDitchAdded;
int i,j;
int iSgn;
int iRoadPointsToAdd = 0;
int iCrossSectionPointsToAdd = 0;
float fX, fY;
TSG_Point P;
ModifiedCrossSection.clear();
ModifiedRoadSection.clear();
//left half
for (i = 0 ; i < iCrossSectionPoints - 1; i++){
if (pCrossSection[i].x < pRoadSection[0].x &&
pCrossSection[i+1].x >= pRoadSection[0].x){
break;
}//if
}//for
if (i == iCrossSectionPoints - 1){
if (pRoadSection[0].y + fHeight < pCrossSection[0].y){
P.x = pRoadSection[0].x - 2* DITCH_WIDTH * SLOPE_TRANSITION - DITCH_WIDTH
- fabs(pCrossSection[0].y - pRoadSection[0].y - fHeight) / SLOPE_RATIO;
P.y = pCrossSection[0].y - fHeight;
ModifiedRoadSection.push_back(P);
P.y = pCrossSection[0].y;
ModifiedCrossSection.push_back(P);
iCrossSectionPointsToAdd++;
iRoadPointsToAdd++;
P.x = pRoadSection[0].x - 2* DITCH_WIDTH * SLOPE_TRANSITION - DITCH_WIDTH;
P.y = pRoadSection[0].y;
ModifiedRoadSection.push_back(P);
iRoadPointsToAdd++;
P.x = pRoadSection[0].x - DITCH_WIDTH * SLOPE_TRANSITION - DITCH_WIDTH;
P.y = pRoadSection[0].y - DITCH_WIDTH / SLOPE_TRANSITION;
ModifiedRoadSection.push_back(P);
iRoadPointsToAdd++;
P.x = pRoadSection[0].x - DITCH_WIDTH * SLOPE_TRANSITION;
ModifiedRoadSection.push_back(P);
iRoadPointsToAdd++;
}//if
P.x = pRoadSection[0].x - fabs(pCrossSection[0].y - pRoadSection[0].y - fHeight) / SLOPE_RATIO;
P.y = pCrossSection[0].y - fHeight;
ModifiedRoadSection.push_back(P);
P.y = pCrossSection[0].y;
ModifiedCrossSection.push_back(P);
iCrossSectionPointsToAdd++;
iRoadPointsToAdd++;
}//if
else{
bDitchAdded = false;
for (j = 0; j < 4; j++){ //4 dummy points
ModifiedRoadSection.push_back(pRoadSection[0]);
}//for
for (j = i ; j >= 0; j--){
if (ModifiedRoadSection[1].y + fHeight > pCrossSection[j+1].y){
iSgn = -1;
}//if
else{
iSgn = 1;
}//else
Intersect_Lines(ModifiedRoadSection[1].x, ModifiedRoadSection[1].y + fHeight,
ModifiedRoadSection[1].x - LONG_SEGMENT / SLOPE_RATIO,
ModifiedRoadSection[1].y + LONG_SEGMENT * iSgn + fHeight,
pCrossSection[j].x, pCrossSection[j].y,
pCrossSection[j+1].x, pCrossSection[j+1].y,
fX,fY);
if (pCrossSection[j].x < fX && pCrossSection[j+1].x >= fX){
if (iSgn == 1){
if(!bDitchAdded){
ModifiedRoadSection[1].x = pRoadSection[0].x - 2* DITCH_WIDTH * SLOPE_TRANSITION - DITCH_WIDTH;
ModifiedRoadSection[1].y = pRoadSection[0].y;
iRoadPointsToAdd++;
ModifiedRoadSection[2].x = pRoadSection[0].x - DITCH_WIDTH * SLOPE_TRANSITION - DITCH_WIDTH;
ModifiedRoadSection[2].y = pRoadSection[0].y - DITCH_WIDTH / SLOPE_TRANSITION;
iRoadPointsToAdd++;
ModifiedRoadSection[3].x = pRoadSection[0].x - DITCH_WIDTH * SLOPE_TRANSITION;
ModifiedRoadSection[3].y = pRoadSection[0].y - DITCH_WIDTH / SLOPE_TRANSITION;
iRoadPointsToAdd++;
j = i + 1;
bDitchAdded = true;
}//if
else{
ModifiedRoadSection[0].x = fX;
ModifiedRoadSection[0].y = fY - fHeight;
iRoadPointsToAdd++;
break;
}//else
}//if
else{
ModifiedRoadSection[0].x = fX;
ModifiedRoadSection[0].y = fY - fHeight;
iRoadPointsToAdd++;
break;
}//else
}//if
}//for
if (j < 0){
ModifiedRoadSection[0].x = pRoadSection[0].x - fabs(pCrossSection[0].y - pRoadSection[0].y - fHeight) / SLOPE_RATIO;
ModifiedRoadSection[0].y = pCrossSection[0].y - fHeight;
P.x = ModifiedRoadSection[0].x;
P.y = pCrossSection[0].y;
ModifiedCrossSection.push_back(P);
iCrossSectionPointsToAdd++;
iRoadPointsToAdd++;
}//if*/
}//else
//add the central points
for (i = 0; i < iCrossSectionPoints; i++){
ModifiedCrossSection.push_back(pCrossSection[i]);
}//for
ModifiedRoadSection.resize(iRoadPoints + iRoadPointsToAdd);
for (i = 0; i < iRoadPoints; i++){
ModifiedRoadSection[i + iRoadPointsToAdd].x = pRoadSection[i].x;
ModifiedRoadSection[i + iRoadPointsToAdd].y = pRoadSection[i].y;
}//for
for (i = 0; i < iRoadPoints + iRoadPointsToAdd; i++){
ModifiedRoadSection[i].x = ModifiedRoadSection[i].x;
ModifiedRoadSection[i].y = ModifiedRoadSection[i].y + fHeight;
}//for
iRoadPoints += iRoadPointsToAdd;
iCrossSectionPoints += iCrossSectionPointsToAdd;
// right half
for (i = 0 ; i < iCrossSectionPoints - 1; i++){
if (ModifiedCrossSection[i].x < ModifiedRoadSection[iRoadPoints-1].x &&
ModifiedCrossSection[i+1].x >= ModifiedRoadSection[iRoadPoints-1].x){
break;
}//if
}//for
if (i == iCrossSectionPoints - 1){
if (ModifiedRoadSection[iRoadPoints-1].y + fHeight < ModifiedCrossSection[iCrossSectionPoints-1].y){
P.x = ModifiedRoadSection[iRoadPoints-1].x + DITCH_WIDTH * SLOPE_TRANSITION;
P.y = ModifiedRoadSection[iRoadPoints-1].y - DITCH_WIDTH / SLOPE_TRANSITION;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
P.x = ModifiedRoadSection[iRoadPoints-2].x + DITCH_WIDTH * SLOPE_TRANSITION + DITCH_WIDTH;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
P.x = ModifiedRoadSection[iRoadPoints-3].x + 2* DITCH_WIDTH * SLOPE_TRANSITION + DITCH_WIDTH;
P.y = ModifiedRoadSection[iRoadPoints-3].y;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
}//if
P.x = ModifiedRoadSection[iRoadPoints-1].x
+ fabs(ModifiedCrossSection[iCrossSectionPoints-1].y
- ModifiedRoadSection[iRoadPoints-1].y) / SLOPE_RATIO;
P.y = ModifiedCrossSection[iCrossSectionPoints-1].y ;
ModifiedRoadSection.push_back(P);
ModifiedCrossSection.push_back(P);
iCrossSectionPoints++;
iRoadPoints++;
}//if
else{
bDitchAdded = false;
for (j = i ; j < iCrossSectionPoints - 1; j++){
if (ModifiedRoadSection[iRoadPoints-1].y > ModifiedCrossSection[j].y){
iSgn = -1;
}//if
else{
iSgn = 1;
}//else
if (iSgn == 1 && !bDitchAdded){
P.x = ModifiedRoadSection[iRoadPoints-1].x + DITCH_WIDTH * SLOPE_TRANSITION;
P.y = ModifiedRoadSection[iRoadPoints-1].y - DITCH_WIDTH / SLOPE_TRANSITION;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
P.x = ModifiedRoadSection[iRoadPoints-2].x + DITCH_WIDTH * SLOPE_TRANSITION + DITCH_WIDTH;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
P.x = ModifiedRoadSection[iRoadPoints-3].x + 2* DITCH_WIDTH * SLOPE_TRANSITION + DITCH_WIDTH;
P.y = ModifiedRoadSection[iRoadPoints-3].y;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
if (ModifiedRoadSection[iRoadPoints-1].y > ModifiedCrossSection[j].y){
iSgn = -1;
}//if
else{
iSgn = 1;
}//else
bDitchAdded = true;
}//if
Intersect_Lines(ModifiedRoadSection[iRoadPoints-1].x, ModifiedRoadSection[iRoadPoints-1].y,
ModifiedRoadSection[iRoadPoints-1].x + LONG_SEGMENT / SLOPE_RATIO,
ModifiedRoadSection[iRoadPoints-1].y + LONG_SEGMENT * iSgn,
ModifiedCrossSection[j].x, ModifiedCrossSection[j].y,
ModifiedCrossSection[j+1].x, ModifiedCrossSection[j+1].y,
fX,fY);
if (ModifiedCrossSection[j].x < fX && ModifiedCrossSection[j+1].x >= fX){
P.x = fX;
P.y = fY;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
break;
}//if
}//for
if (j == iCrossSectionPoints - 1){
if (ModifiedRoadSection[iRoadPoints-1].y + fHeight < ModifiedCrossSection[iCrossSectionPoints-1].y
&& !bDitchAdded){
P.x = ModifiedRoadSection[iRoadPoints-1].x + DITCH_WIDTH * SLOPE_TRANSITION;
P.y = ModifiedRoadSection[iRoadPoints-1].y - DITCH_WIDTH / SLOPE_TRANSITION;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
P.x = ModifiedRoadSection[iRoadPoints-2].x + DITCH_WIDTH * SLOPE_TRANSITION + DITCH_WIDTH;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
P.x = ModifiedRoadSection[iRoadPoints-3].x + 2* DITCH_WIDTH * SLOPE_TRANSITION + DITCH_WIDTH;
P.y = ModifiedRoadSection[iRoadPoints-3].y;
ModifiedRoadSection.push_back(P);
iRoadPoints++;
}//if
P.x = ModifiedRoadSection[iRoadPoints-1].x
+ fabs(ModifiedCrossSection[iCrossSectionPoints-1].y
- ModifiedRoadSection[iRoadPoints-1].y) / SLOPE_RATIO;
P.y = ModifiedCrossSection[iCrossSectionPoints-1].y ;
ModifiedRoadSection.push_back(P);
ModifiedCrossSection.push_back(P);
iCrossSectionPoints++;
iRoadPoints++;
}//if*/
}//else
}//method
void CPDFDocEngine_CrossSections::Intersect_Lines(float x0,float y0,float x1,float y1,
float x2,float y2,float x3,float y3,
float &xi,float &yi){
float a1,b1,c1,
a2,b2,c2,
det_inv,
m1,m2;
if ((x1-x0)!=0)
m1 = (y1-y0)/(x1-x0);
else
m1 = (float)1e+10;
if ((x3-x2)!=0)
m2 = (y3-y2)/(x3-x2);
else
m2 = (float)1e+10;
a1 = m1;
a2 = m2;
b1 = -1;
b2 = -1;
c1 = (y0-m1*x0);
c2 = (y2-m2*x2);
det_inv = 1/(a1*b2 - a2*b1);
xi=((b1*c2 - b2*c1)*det_inv);
yi=((a2*c1 - a1*c2)*det_inv);
} //method
void CPDFDocEngine_CrossSections::CalculateAreas(TSG_Point * pCrossSection,
TSG_Point * pRoadSection,
float fHeight,
int iCrossSectionPoints,
int iRoadPoints,
float &fPositiveArea,
float &fNegativeArea){
int i;
CSG_Shapes *pRoadShapes, *pCrossSectionShapes, *pResultShapes;
CSG_Shape *pRoadShape, *pCrossSectionShape, *pResultShape;
pResultShapes = new CSG_Shapes;
pResultShapes->Create(SHAPE_TYPE_Polygon);
pResultShape = pResultShapes->Add_Shape();
pRoadShapes = new CSG_Shapes;
pRoadShapes->Create(SHAPE_TYPE_Polygon);
pRoadShape = pRoadShapes->Add_Shape();
pCrossSectionShapes = new CSG_Shapes;
pCrossSectionShapes->Create(SHAPE_TYPE_Polygon);
pCrossSectionShape = pCrossSectionShapes->Add_Shape();
for (i = 0; i < iRoadPoints; i++){
pRoadShape->Add_Point(pRoadSection[i].x, pRoadSection[i].y + fHeight);
}//for
pRoadShape->Add_Point(pRoadSection[iRoadPoints-1].x + LONG_SEGMENT / SLOPE_RATIO,
pRoadSection[iRoadPoints-1].y + fHeight + LONG_SEGMENT);
pRoadShape->Add_Point(pRoadSection[0].x - LONG_SEGMENT / SLOPE_RATIO,
pRoadSection[0].y + fHeight + LONG_SEGMENT);
for (i = 0; i < iCrossSectionPoints; i++){
pCrossSectionShape->Add_Point(pCrossSection[i].x, pCrossSection[i].y);
}//for
pCrossSectionShape->Add_Point(pCrossSection[iCrossSectionPoints-1].x + LONG_SEGMENT / SLOPE_RATIO,
pCrossSection[iCrossSectionPoints-1].y - LONG_SEGMENT);
pCrossSectionShape->Add_Point(pCrossSection[0].x - LONG_SEGMENT / SLOPE_RATIO,
pCrossSection[0].y - LONG_SEGMENT);
if (GPC_Intersection(pCrossSectionShape, pRoadShape, pResultShape)){
fNegativeArea = ((CSG_Shape_Polygon*)pResultShape)->Get_Area();
}//if
else{
fNegativeArea = 0;
}//else
pCrossSectionShape->Del_Parts();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -