📄 pdfdocengine_crosssections.cpp
字号:
pRoadShape->Del_Parts();
pResultShape->Del_Parts();
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)){
fPositiveArea = ((CSG_Shape_Polygon*)pResultShape)->Get_Area();
}//if
else{
fPositiveArea = 0;
}//else
delete pRoadShapes;
delete pCrossSectionShapes;
delete pResultShapes;
}//method
void CPDFDocEngine_CrossSections::AddLongitudinalProfile(TSG_Point * pProfile,
float *pHeight,
int iNumPoints){
int i;
int iMag;
int iNumLines;
float fMinLine = 0;
float fMaxY, fMinY;
float fMaxX, fMinX;
float fStep;
float fX, fY;
float fOffsetX;
CSG_String sValue;
CSG_Points Points;
float fHeight;
Add_Page_Title(_TL("Longitudinal Profile"), PDF_TITLE_01);
Add_Page(PDF_PAGE_SIZE_A3, PDF_PAGE_ORIENTATION_LANDSCAPE);
fHeight = Get_Size_Page().Get_YMax() - Get_Size_Page().Get_YMin();
m_iOffsetY = 50;
fMaxY = pProfile[0].y;
fMinY = pProfile[0].y;
for (i = 0; i < iNumPoints; i++) {
if (pProfile[i].y > fMaxY) {
fMaxY = pProfile[i].y;
}// if
if (pProfile[i].y < fMinY) {
fMinY = pProfile[i].y;
}// if
if (pHeight[i] > fMaxY) {
fMaxY = pHeight[i];
}// if
if (pHeight[i] < fMinY) {
fMinY = pHeight[i];
}// if
}//for
iMag = (int) (log(fMaxY - fMinY) / log(10.0));
fStep = (float) ((int) pow(10.0, (double) iMag));
if (fStep == 0){
fStep = 1.;
}//if
if (fMinY < 0) {
iMag = (int) (log(fabs(fMinY)) / log(10.0));
fMinLine = -(int) pow(10.0, (double) iMag);
}// if
else {
fMinLine=(int)(((int)(fMinY/fStep)) *fStep);
}//else
iNumLines = (int) ((fMaxY - fMinY) / fStep);
while (iNumLines < 8) {
fStep = fStep / 2.0;
iNumLines = (int) ((fMaxY - fMinY) / fStep);
}// while
iNumLines = (int) ((fMaxY - fMinLine) / fStep);
fHeight = Get_Size_Page().Get_YMax() - Get_Size_Page().Get_YMin();
for (i = 0; i < iNumLines; i++) {
fX = OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION;
fY = m_iOffsetY + PROFILE_HEIGHT
- ((fMinLine + fStep * i - fMinY) / (fMaxY - fMinY)) * PROFILE_HEIGHT;
if (fY <= m_iOffsetY + PROFILE_HEIGHT && fY >= m_iOffsetY) {
fY = fHeight - fY;
sValue = SG_Get_String(fMinLine + fStep * (float) i);
Draw_Text(fX - 10, fY, SG_Get_String(fMinLine + fStep * (float) i).c_str(), 9,
PDF_STYLE_TEXT_ALIGN_H_RIGHT);
Draw_Line(fX, fY, fX - 5, fY, 0);
}// if
}// for
fMinX = pProfile[0].x;
fMaxX = pProfile[iNumPoints - 1].x;
iMag = (int) (log(fMaxX - fMinX) / log(10.0));
fStep = (float) pow(10.0, (double) iMag);
iNumLines = (int) ((fMaxX-fMinX) / fStep);
while (iNumLines < 3) {
fStep = fStep / 2.0;
iNumLines = (int) ((fMaxX-fMinX) / fStep);
}// while
fMinLine = (int)(((int)(fMinX/fStep)) * fStep);
while (fMinLine<fMinX){
fMinLine+=fStep;
}//while
fOffsetX = fMinX-fMinLine;
for (i = 0; i < iNumLines; i++) {
fX = OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION
+ ((fStep * (float) i-fOffsetX) / (fMaxX-fMinX)) * PROFILE_WIDTH;
if (fX>=OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION
&& fX < OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION + PROFILE_WIDTH){
if (fabs(fStep * (float)i+fMinLine) > 100000) {
sValue = SG_Get_String(fStep * (float)i+fMinLine);
}// if
else {
sValue = SG_Get_String(fStep * (float)i+fMinLine, 2, true);
}// else
Draw_Text(fX, fHeight - m_iOffsetY - PROFILE_HEIGHT - 15,
SG_Get_String(fMinLine + fStep * (float) i).c_str(), 9,
PDF_STYLE_TEXT_ALIGN_H_CENTER | PDF_STYLE_TEXT_ALIGN_V_TOP);
Draw_Line(fX, fHeight - m_iOffsetY - PROFILE_HEIGHT,
fX, fHeight - m_iOffsetY - PROFILE_HEIGHT - 10, 0);
}//if
}// for
Draw_Line(OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION, fHeight - m_iOffsetY,
OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION,
fHeight - m_iOffsetY - PROFILE_HEIGHT, 2);
Draw_Line(OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION,
fHeight - m_iOffsetY - PROFILE_HEIGHT,
OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION + PROFILE_WIDTH,
fHeight - m_iOffsetY - PROFILE_HEIGHT, 2);
fY = m_iOffsetY + PROFILE_HEIGHT
- PROFILE_HEIGHT * ((pProfile[0].y - fMinY) / (fMaxY - fMinY));
fY = fHeight - fY;
fX = OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION
+ PROFILE_WIDTH * ((pProfile[0].x - fMinX) / (fMaxX - fMinX));
Points.Add(fX, fY);
for (i = 1; i < iNumPoints; i++) {
fY = m_iOffsetY + PROFILE_HEIGHT
- PROFILE_HEIGHT * ((pProfile[i].y - fMinY) / (fMaxY - fMinY));
fY = fHeight - fY;
fX = OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION
+ PROFILE_WIDTH * ((pProfile[i].x - fMinX) / (fMaxX - fMinX));
Points.Add(fX, fY);
}// for
Draw_Line(Points, 2, 0x00bb00);
Points.Clear();
fY = m_iOffsetY + PROFILE_HEIGHT
- PROFILE_HEIGHT * ((pHeight[0] - fMinY) / (fMaxY - fMinY));
fY = fHeight - fY;
fX = OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION
+ PROFILE_WIDTH * ((pProfile[0].x - fMinX) / (fMaxX - fMinX));
Points.Add(fX,fY);
for (i = 1; i < iNumPoints; i++) {
fY = m_iOffsetY + PROFILE_HEIGHT
- PROFILE_HEIGHT * ((pHeight[i] - fMinY) / (fMaxY - fMinY));
fY = fHeight - fY;
fX = OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION
+ PROFILE_WIDTH * ((pProfile[i].x - fMinX) / (fMaxX - fMinX));
Points.Add(fX, fY);
}// for
Draw_Line(Points, 2, 0x0000bb);
DrawGuitar(pProfile, pHeight, iNumPoints);
}//method
void CPDFDocEngine_CrossSections::DrawGuitar(TSG_Point *pProfile,
float *pHeight,
int iNumPoints){
int i;
float fY;
float fMinX, fMaxX;
float fDif;
CSG_String sValue;
CSG_String sField [] = {"Distancia","Dist. Parcial.", "Elevacion del terreno", "Elevaci髇 de la calzada", " ", " "};
float fHeight;
fMinX = pProfile[0].x;
fMaxX = pProfile[iNumPoints - 1].x;
fHeight = Get_Size_Page().Get_YMax() - Get_Size_Page().Get_YMin();
for (i = 0; i < 7; i++){
fY = m_iOffsetY + PROFILE_HEIGHT + SEPARATION + GUITAR_LEYEND_HEIGHT / 6 * i;
fY = fHeight - fY;
Draw_Line(OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION, fY,
OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION + GUITAR_WIDTH, fY, 0, 0x880000);
if (i){
Draw_Text(OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION - 10,
fY + GUITAR_LEYEND_HEIGHT / 13,
sField[i-1].c_str(),
9,
PDF_STYLE_TEXT_ALIGN_V_CENTER | PDF_STYLE_TEXT_ALIGN_H_RIGHT);
}//if
}//for
AddGuitarValue(0, 0, fMinX, fMaxX, 1);
for (i = 0; i < iNumPoints; i++) {
AddGuitarValue(pProfile[i].x, pProfile[i].x / 1000, fMinX, fMaxX, 0);
if (i){
AddGuitarValue(pProfile[i].x, pProfile[i].x / 1000 - pProfile[i-1].x / 1000,
fMinX, fMaxX, 1);
}//if
fDif = pProfile[i].y - pHeight[i];
AddGuitarValue(pProfile[i].x, pProfile[i].y, fMinX, fMaxX, 2);
AddGuitarValue(pProfile[i].x, pHeight[i], fMinX, fMaxX, 3);
if (fDif > 0){
AddGuitarValue(pProfile[i].x, fDif, fMinX, fMaxX, 4);
}//if
else{
AddGuitarValue(pProfile[i].x, fDif, fMinX, fMaxX, 5);
}//else
}// for
}//method
void CPDFDocEngine_CrossSections::AddGuitarValue(float fXValue,
float fValue,
float fMinX,
float fMaxX,
int iLine){
float fX,fY;
float fHeight;
fHeight = Get_Size_Page().Get_YMax() - Get_Size_Page().Get_YMin();
fX = OFFSET_Y + GUITAR_LEYEND_WIDTH + SEPARATION
+ PROFILE_WIDTH * ((fXValue - fMinX) / (fMaxX - fMinX));
fY = m_iOffsetY + PROFILE_HEIGHT + SEPARATION + GUITAR_LEYEND_HEIGHT / 6 * (iLine + 1);
fY = fHeight - fY;
Draw_Line(fX, fY, fX, fY + 3, 0, 0x880000);
fY += 3;
fX += 3;
Draw_Text(fX, fY, SG_Get_String(fValue, 2).c_str(), 8,
0,
3.14159/2.);
fY = m_iOffsetY + PROFILE_HEIGHT + SEPARATION + GUITAR_LEYEND_HEIGHT / 6 * iLine;
fY = fHeight - fY;
fX -= 3;
Draw_Line(fX, fY, fX, fY - 3, 0, 0x880000);
}//method
bool CPDFDocEngine_CrossSections::GPC_Intersection(CSG_Shape *pShape_A, CSG_Shape *pShape_B, CSG_Shape *pShape_AB){
bool bResult;
int iPoint, nPoints, iPart;
gpc_polygon poly_A, poly_B, poly_AB;
gpc_vertex *Contour;
bResult = false;
if( GPC_Create_Polygon(pShape_A, &poly_A)
&& GPC_Create_Polygon(pShape_B, &poly_B) )
{
gpc_polygon_clip(GPC_INT, &poly_A, &poly_B, &poly_AB);
if( poly_AB.num_contours > 0 )
{
pShape_AB->Del_Parts();
for(iPart=0; iPart<poly_AB.num_contours; iPart++)
{
Contour = poly_AB.contour[iPart].vertex;
nPoints = poly_AB.contour[iPart].num_vertices;
for(iPoint=0; iPoint<nPoints; iPoint++)
{
pShape_AB->Add_Point(Contour[iPoint].x, Contour[iPoint].y, iPart);
}
}
bResult = true;
}
gpc_free_polygon(&poly_AB);
}
gpc_free_polygon(&poly_A);
gpc_free_polygon(&poly_B);
return( bResult );
}
bool CPDFDocEngine_CrossSections::GPC_Create_Polygon(CSG_Shape *pShape, gpc_polygon *pPolygon)
{
int iPoint, iPart;
TSG_Point Point;
gpc_vertex *Contour;
gpc_vertex_list vList;
pPolygon->contour = NULL;
pPolygon->hole = NULL;
pPolygon->num_contours = 0;
//-----------------------------------------------------
for(iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
{
if( pShape->Get_Point_Count(iPart) > 0 )
{
Contour = (gpc_vertex *)malloc(pShape->Get_Point_Count(iPart) * sizeof(gpc_vertex));
for(iPoint=0; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
{
Point = pShape->Get_Point(iPoint, iPart);
Contour[iPoint].x = Point.x;
Contour[iPoint].y = Point.y;
}
vList.num_vertices = pShape->Get_Point_Count(iPart);
vList.vertex = Contour;
gpc_add_contour(pPolygon, &vList, ((CSG_Shape_Polygon *)pShape)->is_Lake(iPart) ? 1 : 0);
free(Contour);
}
}
return( pPolygon->num_contours > 0 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -