📄 pdfdocengine_crosssections.cpp
字号:
/*******************************************************************************
PDFDocEngine_CrossSections.cpp
Copyright (C) Victor Olaya . Proyecto Sextante (http://sextante.sf.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*******************************************************************************/
#include "PDFDocEngine_CrossSections.h"
#include <math.h>
#include <saga_api/saga_api.h>
#define SLOPE_TRANSITION 1
#define DITCH_WIDTH 1
CPDFDocEngine_CrossSections::CPDFDocEngine_CrossSections(){}
CPDFDocEngine_CrossSections::~CPDFDocEngine_CrossSections(){}
void CPDFDocEngine_CrossSections::AddCrossSections(TSG_Point ** pCrossSections,
float *pHeight,
TSG_Point * pRoadSection,
int iSections,
int iCrossSectionPoints,
int iRoadPoints){
int i,j;
std::vector<TSG_Point> ModifiedRoadSection;
std::vector<TSG_Point> ModifiedCrossSection;
TSG_Point *pModifiedRoadSection;
TSG_Point *pModifiedCrossSection;
int iCrossSectionPointsB;
int iRoadPointsB;
Add_Page_Title (_TL("Cross Sections"), PDF_TITLE_01, PDF_PAGE_SIZE_A4, PDF_PAGE_ORIENTATION_PORTRAIT);
for (i = 0; i < iSections; i++){
m_iOffsetY = OFFSET_Y + CROSS_SECTION_HEIGHT * 1.1 * (i % SECTIONS_PER_PAGE);
if (m_iOffsetY == OFFSET_Y){
Add_Page();
}//if
iCrossSectionPointsB = iCrossSectionPoints;
iRoadPointsB = iRoadPoints;
AdjustSections(pCrossSections[i], pRoadSection, ModifiedCrossSection, ModifiedRoadSection,
pHeight[i], iCrossSectionPointsB, iRoadPointsB);
pModifiedCrossSection = new TSG_Point [iCrossSectionPointsB];
pModifiedRoadSection = new TSG_Point [iRoadPointsB];
for (j = 0; j < iCrossSectionPointsB; j++){
pModifiedCrossSection[j] = ModifiedCrossSection[j];
}//for
for (j = 0; j < iRoadPointsB; j++){
pModifiedRoadSection[j] = ModifiedRoadSection[j];
}//for
AddCrossSection(pModifiedCrossSection, pModifiedRoadSection,
iCrossSectionPointsB, iRoadPointsB);
delete [] pModifiedRoadSection;
delete [] pModifiedCrossSection;
}//for
}//method
void CPDFDocEngine_CrossSections::AddCrossSection(TSG_Point * pCrossSection,
TSG_Point * pRoadSection,
int iCrossSectionPoints,
int iRoadPoints){
int i;
int iMag;
int iNumLines;
int iFirstPoint, iLastPoint;
float fMinLine = 0;
float fMaxY, fMinY;
float fMaxX, fMinX;
float fStep;
float fX, fY;
float fOffsetX;
float fDifX, fDifY;
float fRatio;
float fHeight;
CSG_String sValue;
CSG_Points Points;
iFirstPoint = 0;
iLastPoint = iCrossSectionPoints - 1;
for (i = 1; i < iCrossSectionPoints; i++) {
if (pCrossSection[i].x > pRoadSection[0].x){
iFirstPoint = i - 1;
break;
}//if
}//for
for (i = 1; i < iCrossSectionPoints; i++) {
if (pCrossSection[i].x > pRoadSection[iRoadPoints - 1].x){
iLastPoint = i;
break;
}//if
}//for
fMinX = pCrossSection[iFirstPoint].x;
fMaxX = pCrossSection[iLastPoint].x;
fDifX = fMaxX - fMinX;
fMaxY = pCrossSection[0].y;
fMinY = pCrossSection[0].y;
for (i = iFirstPoint ; i < iLastPoint + 1; i++) {
if (pCrossSection[i].y > fMaxY) {
fMaxY = pCrossSection[i].y;
}// if
if (pCrossSection[i].y < fMinY) {
fMinY = pCrossSection[i].y;
}// if
}//for
for (i = 0; i < iRoadPoints; i++) {
if (pRoadSection[i].y > fMaxY) {
fMaxY = pRoadSection[i].y;
}// if
if (pRoadSection[i].y < fMinY) {
fMinY = pRoadSection[i].y;
}// if
}//for
fDifY = fMaxY - fMinY;
fRatio = (fDifX / fDifY) / (CROSS_SECTION_WIDTH / CROSS_SECTION_HEIGHT);
if (fRatio > 1){
fMaxY = fMaxY + fDifY / 2. * (fRatio - 1.);
fMinY = fMinY - fDifY / 2. * (fRatio - 1.);
}//if
else{
fMaxX = fMaxX + fDifX / 2. * (1. / fRatio - 1.);
fMinX = fMinX - fDifX / 2. * (1. / fRatio - 1.);
}//else
fMaxX = fMaxX + fDifX * .05;
fMinX = fMinX - fDifX * .05;
fMaxY = fMaxY + fDifY * .05;
fMinY = fMinY - fDifY * .05;
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();
//horizontal lines
for (i = 0; i < iNumLines; i++) {
fY = m_iOffsetY + CROSS_SECTION_HEIGHT
- ((fMinLine + fStep * i - fMinY) / (fMaxY - fMinY)) * CROSS_SECTION_HEIGHT;
if (fY <= m_iOffsetY + CROSS_SECTION_HEIGHT && fY >= m_iOffsetY) {
fY = fHeight - fY;
sValue = SG_Get_String(fMinLine + fStep * (float) i);
Draw_Text(OFFSET_X - 10, fY, SG_Get_String(fMinLine + fStep * (float) i).c_str(),
9, PDF_STYLE_TEXT_ALIGN_H_RIGHT);
Draw_Line(OFFSET_X, fY, OFFSET_X - 5, fY, 0);
}// if
}// for
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;
//vertical lines
for (i = 0; i < iNumLines; i++) {
fX = OFFSET_X + ((fStep * (float) i-fOffsetX) / (fMaxX-fMinX)) * CROSS_SECTION_WIDTH;
if (fX >= OFFSET_X && fX < OFFSET_X + CROSS_SECTION_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_Line (fX, fHeight - m_iOffsetY - CROSS_SECTION_HEIGHT,
fX, fHeight - m_iOffsetY - CROSS_SECTION_HEIGHT - 10);
Draw_Text(fX, fHeight - m_iOffsetY - CROSS_SECTION_HEIGHT - 15,
SG_Get_String(fMinLine + fStep * (float) i).c_str(), 9,
PDF_STYLE_TEXT_ALIGN_H_CENTER | PDF_STYLE_TEXT_ALIGN_V_TOP );
}//if
}// for
//axis
Draw_Line (OFFSET_X, fHeight - m_iOffsetY,
OFFSET_X, fHeight - m_iOffsetY - CROSS_SECTION_HEIGHT, 2);
Draw_Line (OFFSET_X, fHeight - m_iOffsetY - CROSS_SECTION_HEIGHT,
OFFSET_X + CROSS_SECTION_WIDTH,
fHeight - m_iOffsetY - CROSS_SECTION_HEIGHT, 2);
//cross sections
fY = m_iOffsetY + CROSS_SECTION_HEIGHT
- CROSS_SECTION_HEIGHT * ((pCrossSection[iFirstPoint].y - fMinY) / (fMaxY - fMinY));
fY = fHeight - fY;
fX = OFFSET_X + CROSS_SECTION_WIDTH * ((pCrossSection[iFirstPoint].x - fMinX) / (fMaxX - fMinX));
Points.Add(fX,fY);
for (i = iFirstPoint + 1; i < iLastPoint + 1; i++) {
fY = m_iOffsetY + CROSS_SECTION_HEIGHT
- CROSS_SECTION_HEIGHT * ((pCrossSection[i].y - fMinY) / (fMaxY - fMinY));
fY = fHeight - fY;
fX = OFFSET_X + CROSS_SECTION_WIDTH * ((pCrossSection[i].x - fMinX) / (fMaxX - fMinX));
Points.Add(fX,fY);
if (pCrossSection[i].x > fMaxX){
break;
}//if
}// for
Draw_Line(Points, 2, 0x00bb00);
fY = m_iOffsetY + CROSS_SECTION_HEIGHT
- CROSS_SECTION_HEIGHT * ((pRoadSection[0].y - fMinY) / (fMaxY - fMinY));
fY = fHeight - fY;
fX = OFFSET_X + CROSS_SECTION_WIDTH * ((pRoadSection[0].x - fMinX) / (fMaxX - fMinX));
Points.Clear();
Points.Add(fX,fY);
for (i = 1; i < iRoadPoints; i++) {
fY = m_iOffsetY + CROSS_SECTION_HEIGHT
- CROSS_SECTION_HEIGHT * ((pRoadSection[i].y - fMinY) / (fMaxY - fMinY));
fY = fHeight - fY;
fX = OFFSET_X + CROSS_SECTION_WIDTH * ((pRoadSection[i].x - fMinX) / (fMaxX - fMinX));
Points.Add(fX,fY);
}// for
Draw_Line(Points, 0, 0x0000bb);
}//method
void CPDFDocEngine_CrossSections::AddVolumesTable(TSG_Point * pProfile,
TSG_Point ** pCrossSections,
float *pHeight,
TSG_Point * pRoadSection,
int iSections,
int iCrossSectionPoints,
int iRoadPoints){
int i,j;
int iRow;
int iRowsWritten = 0;
float fDist;
float fX,fY;
float fXBox, fYBox;
float fIn, fOut;
float fInPrev, fOutPrev;
float fVolume;
float fHeight;
CSG_String sHeader[] = {_TL("Section"),_TL("Dist."),_TL("Area +"),_TL("Area -"),_TL("Partial D."),_TL("Vol. +"), _TL("Vol. -")};
Add_Page_Title(_TL("Volumes"), PDF_TITLE_01);
fHeight = Get_Size_Page().Get_YMax() - Get_Size_Page().Get_YMin();
for (i = 0; i < iSections; i++){
iRow = iRowsWritten % VOLUMES_TABLE_MAX_ROWS;
if (iRow == 0){
Add_Page();
Draw_Rectangle(OFFSET_X, fHeight - OFFSET_Y,
OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * VOLUMES_TABLE_COLUMNS,
fHeight - OFFSET_Y - VOLUMES_TABLE_ROW_HEIGHT);
fY = OFFSET_Y + VOLUMES_TABLE_ROW_HEIGHT * .6;
fY = fHeight - fY;
for (j = 0; j < VOLUMES_TABLE_COLUMNS; j++){
fX = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * j + VOLUMES_TABLE_COLUMN_WIDTH / 2.;
Draw_Text(fX, fY, sHeader[j].c_str(), 10, PDF_STYLE_TEXT_ALIGN_H_CENTER);
fX = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * (j + 1);
Draw_Line(fX, fHeight - OFFSET_Y,
fX, fHeight - (OFFSET_Y + VOLUMES_TABLE_ROW_HEIGHT),
0);
}//for
if (i){
i--;
}//if
}//if
for (j = 0; j < 4; j++){
fYBox = OFFSET_Y + VOLUMES_TABLE_HEADER_SEPARATION + VOLUMES_TABLE_ROW_HEIGHT * iRow;
fYBox = fHeight - fYBox;
fXBox = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * j;
Draw_Rectangle(fXBox, fYBox, fXBox + VOLUMES_TABLE_COLUMN_WIDTH,
fYBox - VOLUMES_TABLE_ROW_HEIGHT);
}//for
fDist = pProfile[i].x;
fY = OFFSET_Y + VOLUMES_TABLE_HEADER_SEPARATION + VOLUMES_TABLE_ROW_HEIGHT * (iRow + .6);
fY = fHeight - fY;
fX = OFFSET_X + (VOLUMES_TABLE_COLUMN_WIDTH) / 2.;
Draw_Text(fX, fY, SG_Get_String(i,0).c_str(), 10, PDF_STYLE_TEXT_ALIGN_H_CENTER);
fX = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH + (VOLUMES_TABLE_COLUMN_WIDTH) / 2.;
Draw_Text(fX, fY, SG_Get_String(fDist,0).c_str(), 10, PDF_STYLE_TEXT_ALIGN_H_CENTER);
CalculateAreas(pCrossSections[i], pRoadSection, pHeight[i], iCrossSectionPoints,
iRoadPoints,fIn, fOut);
fX = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * 2 + (VOLUMES_TABLE_COLUMN_WIDTH) / 2.;
Draw_Text(fX, fY, SG_Get_String(fIn,0).c_str(), 10, PDF_STYLE_TEXT_ALIGN_H_CENTER);
fX = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * 3 + (VOLUMES_TABLE_COLUMN_WIDTH) / 2.;
Draw_Text(fX, fY, SG_Get_String(fOut,0).c_str(), 10, PDF_STYLE_TEXT_ALIGN_H_CENTER);
if (iRow > 0){
for (j = 4; j < 7; j++){
fYBox = OFFSET_Y + VOLUMES_TABLE_HEADER_SEPARATION + VOLUMES_TABLE_ROW_HEIGHT * (iRow - .5);
fYBox = fHeight - fYBox;
fXBox = OFFSET_X + VOLUMES_TABLE_COLUMN_WIDTH * j;
Draw_Rectangle(fXBox, fYBox, fXBox + VOLUMES_TABLE_COLUMN_WIDTH,
fYBox - VOLUMES_TABLE_ROW_HEIGHT);
}//for
fY = OFFSET_Y + VOLUMES_TABLE_HEADER_SEPARATION + VOLUMES_TABLE_ROW_HEIGHT * (iRow + .1) ;
fY = fHeight - fY;
fDist = (pProfile[i].x - pProfile[i-1].x);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -