| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "lc_isometricgrid.h" |
| |
|
| | #include "lc_lattice.h" |
| | #include "rs_math.h" |
| |
|
| | LC_IsometricGrid::LC_IsometricGrid(LC_GridSystem::LC_GridOptions *options, int iso_projection):LC_GridSystem(options) { |
| | if (iso_projection >= ISO_LEFT && iso_projection < ISO_LAST) { |
| | projection = iso_projection; |
| | } else { |
| | projection = ISO_TOP; |
| | } |
| |
|
| | drawRightLine = projection == ISO_TOP || projection == ISO_RIGHT; |
| | drawLeftLine = projection == ISO_TOP || projection == ISO_LEFT; |
| | drawTopLines = projection == ISO_RIGHT || projection == ISO_LEFT || m_gridOptions->drawIsometricVerticalsAlways; |
| |
|
| | m_gridLattice = std::make_unique<LC_Lattice>(); |
| | } |
| |
|
| | void LC_IsometricGrid::setCellSize(const RS_Vector &gridWidth, const RS_Vector &metaGridWidth) { |
| | |
| | |
| | double gridY = gridWidth.y; |
| | if (gridY != gridWidth.x){ |
| | m_gridCellSize = RS_Vector(gridY, gridY); |
| | m_metaGridCellSize = RS_Vector(metaGridWidth.y, metaGridWidth.y); |
| | } |
| | else { |
| | LC_GridSystem::setCellSize(gridWidth, metaGridWidth); |
| | } |
| | } |
| |
|
| | RS_Vector LC_IsometricGrid::snapGrid(const RS_Vector &coord) const { |
| | RS_Vector normalizedPosition(coord - m_gridBasePoint); |
| |
|
| | |
| |
|
| | double xInSnapCell = remainder(normalizedPosition.x, 2 * gridDeltaX.x); |
| | double yInSnapCell = remainder(normalizedPosition.y, 2 * gridDeltaY.y); |
| | RS_Vector positionInSnapCell(xInSnapCell, yInSnapCell); |
| |
|
| | RS_Vector foundCellPoint = snapVectorSolution.getClosest(positionInSnapCell); |
| |
|
| | RS_Vector result = m_gridBasePoint + foundCellPoint + normalizedPosition - positionInSnapCell; |
| | return result; |
| | } |
| |
|
| | void LC_IsometricGrid::prepareGridOther(const RS_Vector &viewZero, const RS_Vector &viewSize) { |
| | double angle30Deg = M_PI / 6; |
| | double deltaY = viewSize.y - viewZero.y; |
| | double offsetY = viewSize.y - m_metaGridMin.y; |
| | double offsetX = viewZero.x - m_metaGridMin.x; |
| |
|
| | |
| | |
| | |
| |
|
| | double tan30Deg = tan(angle30Deg); |
| | double dxLeft = fabs(offsetY / tan30Deg); |
| | double dxRight = fabs(deltaY / tan30Deg) - dxLeft; |
| |
|
| | gridDeltaLeft = dxLeft; |
| | gridDeltaRight = dxRight; |
| |
|
| | RS_Vector viewMaxPoint = RS_Vector(viewSize.x, viewZero.y); |
| | const RS_Vector metaGridViewOffset = RS_Vector(offsetX, offsetY); |
| |
|
| | m_gridBasePoint = m_metaGridMin; |
| |
|
| | m_numPointsInMetagridX = RS_Math::round(m_metaGridCellSize.x / m_gridCellSize.x) - 1; |
| | m_numPointsInMetagridY = RS_Math::round(m_metaGridCellSize.y / m_gridCellSize.y) - 1; |
| |
|
| |
|
| | calculateTilesGridMetrics(viewMaxPoint, metaGridViewOffset); |
| | m_gridLattice->update(30, 60, m_gridCellSize, 0); |
| | prepareSnapSolution(); |
| | } |
| |
|
| | void LC_IsometricGrid::determineMetaGridBoundaries(const RS_Vector &viewZero, const RS_Vector &viewSize) { |
| | isometricCell = RS_Vector(m_metaGridCellSize.x * 2, 0); |
| | double angle30Deg = M_PI / 6; |
| | isometricCell.rotate(angle30Deg); |
| | double metaHorizontalX = isometricCell.x; |
| | double metaVerticalY = isometricCell.y; |
| |
|
| |
|
| | m_metaGridMin.x = truncToStep(viewZero.x, metaHorizontalX); |
| | m_metaGridMax.x = truncToStep(viewSize.x, metaHorizontalX); |
| | m_metaGridMax.y = truncToStep(viewZero.y, metaVerticalY); |
| | m_metaGridMin.y = truncToStep(viewSize.y, metaVerticalY); |
| |
|
| | if (m_metaGridMin.x < viewZero.x) { |
| | m_metaGridMin.x += metaHorizontalX; |
| | } |
| | if (m_metaGridMax.x > viewSize.x) { |
| | m_metaGridMax.x -= metaHorizontalX; |
| | } |
| | if (viewSize.y > m_metaGridMin.y) { |
| | m_metaGridMin.y += metaVerticalY; |
| | } |
| | if (m_metaGridMax.y > viewZero.y) { |
| | m_metaGridMax.y -= metaVerticalY; |
| | } |
| |
|
| | m_metaGridViewOffset = RS_Vector(-metaHorizontalX, +metaVerticalY); |
| | } |
| |
|
| | void LC_IsometricGrid::createCellVector(const RS_Vector &gridWidth) { |
| | m_cellVector.set(sqrt(3.) * gridWidth.y, fabs(gridWidth.y)); |
| | } |
| |
|
| | void LC_IsometricGrid::determineGridPointsAmount([[maybe_unused]]const RS_Vector &vector) { |
| | } |
| |
|
| | int LC_IsometricGrid::determineTotalPointsAmount([[maybe_unused]]bool drawGridWithoutGaps) { |
| | double metaHorizontalX = isometricCell.x; |
| | double metaVerticalY = isometricCell.y; |
| |
|
| | int numTilesByX = (int) ((m_metaGridMax.x - m_metaGridMin.x) / metaHorizontalX) + 2; |
| | int numTilesByY = (int) ((m_metaGridMax.y - m_metaGridMin.y) / metaVerticalY) + 2; |
| |
|
| |
|
| | int numPointsTotal = numTilesByX * numTilesByY * m_numPointsInMetagridX * m_numPointsInMetagridY * 4; |
| | return numPointsTotal; |
| | } |
| |
|
| | void LC_IsometricGrid::createGridLinesNoGaps(const RS_Vector &min, const RS_Vector &max) { |
| |
|
| | double minX = min.x; |
| | double maxX = max.x; |
| | double minY = min.y; |
| | double maxY = max.y; |
| |
|
| |
|
| | double height = maxY; |
| | double width = maxX; |
| | double uiGridDeltaLeft = gridDeltaLeft; |
| | double uiGridDeltaRight = gridDeltaRight; |
| |
|
| | double metaHorizontalX = isometricCell.x; |
| | double metaGridHalfWidthX = metaHorizontalX / 2; |
| |
|
| | |
| | int numLinesX = width/metaGridHalfWidthX * 2; |
| | int numPointsProjection = numLinesX * numLinesX * 2; |
| |
|
| | m_gridLattice->update(30, 60, m_gridCellSize, numPointsProjection); |
| |
|
| | RS_Vector deltaX = m_gridLattice->getDeltaX() * 2; |
| |
|
| | double distanceToMetaGridTolerance = deltaX.x * 0.9; |
| |
|
| | if (drawTopLines){ |
| | double halfMetaX = metaHorizontalX/2; |
| | double nextMetaX = m_metaGridMin.x + halfMetaX; |
| | double gridByX = deltaX.x/2; |
| | double currentX = m_metaGridMin.x + gridByX; |
| | double verticalTolerance = distanceToMetaGridTolerance /2; |
| | while (true){ |
| | if (currentX > width) { |
| | break; |
| | } |
| | double distanceToMetaLine = std::abs(currentX - nextMetaX); |
| | if (distanceToMetaLine > verticalTolerance) { |
| | m_gridLattice->addLine(currentX, minY, currentX, height); |
| | currentX += gridByX; |
| | } |
| | else{ |
| | nextMetaX += halfMetaX; |
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(currentX, minY, currentX, height); |
| | } |
| | currentX += gridByX; |
| | } |
| | } |
| | |
| | nextMetaX = m_metaGridMin.x - halfMetaX; |
| | currentX = m_metaGridMin.x - gridByX; |
| | while (true) { |
| | double rightPoint = currentX + uiGridDeltaLeft; |
| | if (rightPoint < minX) { |
| | break; |
| | } |
| | double distanceToMetaLine = std::abs(currentX - nextMetaX); |
| | if (distanceToMetaLine > verticalTolerance) { |
| | m_gridLattice->addLine(currentX, minY, currentX, height); |
| | currentX -= gridByX; |
| | } else { |
| | nextMetaX -= halfMetaX; |
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(currentX, minY, currentX, height); |
| | } |
| | currentX -= gridByX; |
| | } |
| | } |
| |
|
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(m_metaGridMin.x, minY, m_metaGridMin.x, height); |
| | } |
| | } |
| |
|
| | if (drawLeftLine) { |
| | |
| | double nextMetaX = m_metaGridMin.x + metaHorizontalX; |
| | double currentX = m_metaGridMin.x + deltaX.x; |
| | while (true) { |
| | double leftPoint = currentX - uiGridDeltaRight; |
| | if (leftPoint > width) { |
| | break; |
| | } |
| | double distanceToMetaLine = std::abs(currentX - nextMetaX); |
| | if (distanceToMetaLine > distanceToMetaGridTolerance) { |
| | m_gridLattice->addLine(currentX + uiGridDeltaLeft, height, currentX - uiGridDeltaRight, minY); |
| | currentX += deltaX.x; |
| | } else { |
| | nextMetaX += metaHorizontalX; |
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(currentX + uiGridDeltaLeft, height, currentX - uiGridDeltaRight, minY); |
| | } |
| | currentX += deltaX.x; |
| | } |
| | } |
| |
|
| | nextMetaX = m_metaGridMin.x - metaHorizontalX; |
| | currentX = m_metaGridMin.x - deltaX.x; |
| |
|
| | |
| | while (true) { |
| | double rightPoint = currentX + uiGridDeltaLeft; |
| | if (rightPoint < minX) { |
| | break; |
| | } |
| | double distanceToMetaLine = std::abs(currentX - nextMetaX); |
| | if (distanceToMetaLine > distanceToMetaGridTolerance) { |
| | m_gridLattice->addLine(currentX + uiGridDeltaLeft, height, currentX - uiGridDeltaRight, minY); |
| | currentX -= deltaX.x; |
| | } else { |
| | nextMetaX -= metaHorizontalX; |
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(currentX + uiGridDeltaLeft, height, currentX - uiGridDeltaRight, minY); |
| | } |
| | currentX -= deltaX.x; |
| | } |
| | } |
| |
|
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(m_metaGridMin.x + uiGridDeltaLeft, height, m_metaGridMin.x - uiGridDeltaRight, minY); |
| | } |
| | } |
| |
|
| | if (drawRightLine) { |
| | |
| | double nextMetaX = m_metaGridMin.x + metaHorizontalX; |
| | double currentX = m_metaGridMin.x + deltaX.x; |
| | while (true) { |
| | double leftPoint = currentX - uiGridDeltaLeft; |
| | if (leftPoint > width) { |
| | break; |
| | } |
| | double distanceToMetaLine = std::abs(currentX - nextMetaX); |
| | if (distanceToMetaLine > distanceToMetaGridTolerance) { |
| | m_gridLattice->addLine(currentX - uiGridDeltaLeft, height, currentX + uiGridDeltaRight, minY); |
| | currentX += deltaX.x; |
| | } else { |
| | nextMetaX += metaHorizontalX; |
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(currentX - uiGridDeltaLeft, height, currentX + uiGridDeltaRight, minY); |
| | } |
| | currentX += deltaX.x; |
| | } |
| | } |
| |
|
| | nextMetaX = m_metaGridMin.x - metaHorizontalX; |
| | currentX = m_metaGridMin.x - deltaX.x; |
| |
|
| | |
| | while (true) { |
| | double rightPoint = currentX + uiGridDeltaRight; |
| | if (rightPoint < minX) { |
| | break; |
| | } |
| | double distanceToMetaLine = std::abs(currentX - nextMetaX); |
| | if (distanceToMetaLine > distanceToMetaGridTolerance) { |
| | m_gridLattice->addLine(currentX - uiGridDeltaLeft, height, currentX + uiGridDeltaRight, minY); |
| | currentX -= deltaX.x; |
| | } else { |
| | nextMetaX -= metaHorizontalX; |
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(currentX - uiGridDeltaLeft, height, currentX + uiGridDeltaRight, minY); |
| | } |
| | currentX -= deltaX.x; |
| | } |
| | } |
| |
|
| | if (!m_gridOptions->drawMetaGrid){ |
| | m_gridLattice->addLine(m_metaGridMin.x - uiGridDeltaLeft, height, m_metaGridMin.x + uiGridDeltaRight, minY); |
| | } |
| | } |
| | } |
| |
|
| |
|
| | void LC_IsometricGrid::createMetaGridLines(const RS_Vector& min, const RS_Vector &max) { |
| |
|
| | double x; |
| |
|
| | double minX = min.x; |
| | double maxX = max.x; |
| | double minY = min.y; |
| | double maxY = max.y; |
| |
|
| |
|
| | double height = maxY; |
| | double width = maxX; |
| | double uiGridDeltaLeft = gridDeltaLeft; |
| | double uiGridDeltaRight = gridDeltaRight; |
| |
|
| | double metaHorizontalX = isometricCell.x; |
| | double metaGridHalfWidthX = metaHorizontalX / 2; |
| |
|
| | |
| | int numLinesX = (width - min.x)/metaGridHalfWidthX * 2; |
| | int numPointsProjection = numLinesX * numLinesX * 2; |
| |
|
| | m_metaGridLattice->update(30, 60, m_metaGridCellSize, numPointsProjection); |
| |
|
| |
|
| | for (x = m_metaGridMin.x; x < width; x += metaHorizontalX) { |
| | if (drawRightLine) { |
| | m_metaGridLattice->addLine(x - uiGridDeltaLeft, height, x + uiGridDeltaRight, minY); |
| | } |
| |
|
| | if (drawLeftLine) { |
| | m_metaGridLattice->addLine(x + uiGridDeltaLeft, height, x - uiGridDeltaRight, minY); |
| | } |
| |
|
| | |
| | if (drawTopLines) { |
| | double halfX = x - metaGridHalfWidthX; |
| | m_metaGridLattice->addLine(x, minY, x, height); |
| | m_metaGridLattice->addLine(halfX, minY, halfX, height); |
| | } |
| | } |
| |
|
| | double lastX = x; |
| | if (drawTopLines) { |
| | |
| | x -= metaGridHalfWidthX; |
| | if (x < width) { |
| | m_metaGridLattice->addLine(x, minY, x, height); |
| | } |
| | } |
| |
|
| | if (drawRightLine) { |
| | |
| | double currentX = m_metaGridMin.x - metaHorizontalX; |
| | while (true) { |
| | double rightPoint = currentX + uiGridDeltaRight; |
| | if (rightPoint < minX) { |
| | break; |
| | } |
| | m_metaGridLattice->addLine(currentX - uiGridDeltaLeft, height, rightPoint, minY); |
| | currentX -= metaHorizontalX; |
| | } |
| |
|
| | |
| | currentX = lastX; |
| | while (true) { |
| | double leftPoint = currentX - uiGridDeltaLeft; |
| | if (leftPoint > width) { |
| | break; |
| | } |
| | m_metaGridLattice->addLine(leftPoint, height, currentX + uiGridDeltaRight, minY); |
| | currentX += metaHorizontalX; |
| | } |
| | } |
| |
|
| | if (drawLeftLine) { |
| | |
| | double currentX = lastX; |
| | while (true) { |
| | double leftPoint = currentX - uiGridDeltaRight; |
| | if (leftPoint > width) { |
| | break; |
| | } |
| | m_metaGridLattice->addLine(currentX + uiGridDeltaLeft, height, currentX - uiGridDeltaRight, minY); |
| | currentX += metaHorizontalX; |
| | } |
| |
|
| | |
| | currentX = m_metaGridMin.x; |
| | while (true) { |
| | double rightPoint = currentX + uiGridDeltaLeft; |
| | if (rightPoint < 0) { |
| | break; |
| | } |
| | m_metaGridLattice->addLine(rightPoint, height, currentX - uiGridDeltaRight, minY); |
| | currentX -= metaHorizontalX; |
| | } |
| | } |
| | } |
| |
|
| | void LC_IsometricGrid::createGridLines(const RS_Vector &min, const RS_Vector &max, const RS_Vector &gridWidth, bool drawGridWithoutGaps, const RS_Vector& lineInTileOffset) { |
| | int linesCount = m_numPointsInMetagridX + m_numPointsInMetagridY; |
| | if (drawGridWithoutGaps){ |
| | createGridLinesNoGaps(min, max); |
| | } |
| | else{ |
| | if (drawTopLines){ |
| | linesCount = linesCount * 4; |
| | } |
| | m_gridLattice->updateForLines(30, 60, gridWidth, lineInTileOffset, linesCount * 2); |
| | if (drawTopLines){ |
| | fillTilesRowsByLinesNoDiagonals(); |
| | } |
| | else{ |
| | fillTilesRowsBylines(); |
| | } |
| | } |
| | } |
| | #define DEBUG_ISO_META_ |
| |
|
| | #ifdef DEBUG_ISO_META |
| | #include "rs_pen.h" |
| | #include "lc_defaults.h" |
| | #endif |
| |
|
| | void LC_IsometricGrid::drawMetaGridLines(RS_Painter *painter, LC_GraphicViewport *view) { |
| | doDrawLines(painter, view, m_metaGridLattice.get()); |
| |
|
| | #ifdef DEBUG_ISO_META |
| |
|
| | double firstX = view->toGuiX(m_metaGridMin.x); |
| |
|
| | double uiGridDeltaLeft = view->toGuiDX(gridDeltaLeft); |
| | double uiGridDeltaRight = view->toGuiDX(gridDeltaRight); |
| |
|
| | painter->setPen({RS_Color(QColor("blue")), RS2::LineWidth::Width00, RS2::LineType::SolidLine,}); |
| | if (drawRightLine) { |
| | painter->drawLine(firstX - uiGridDeltaLeft, view->getHeight(), firstX + uiGridDeltaRight, 0); |
| | } |
| |
|
| | if (drawLeftLine) { |
| | painter->drawLine(firstX + uiGridDeltaLeft, view->getHeight(), firstX - uiGridDeltaRight, 0); |
| | } |
| |
|
| | painter->setPen({RS_Color(QColor("yellow")), RS2::LineWidth::Width00, RS2::LineType::SolidLine,}); |
| | painter->drawLine(view->toGui(m_metaGridMin), view->toGui(m_metaGridMax)); |
| | painter->drawLine(view->toGui(m_metaGridMin), view->toGui(m_metaGridMax.x, m_metaGridMin.y)); |
| |
|
| | painter->setPen({RS_Color(QColor("cyan")), RS2::LineWidth::Width00, RS2::LineType::SolidLine,}); |
| | painter->drawPoint(view->toGui(m_gridBasePoint), LC_DEFAULTS_PDMode, LC_DEFAULTS_PDSize); |
| | #endif |
| | } |
| |
|
| | void LC_IsometricGrid::createGridPoints(const RS_Vector &min, const RS_Vector &max,const RS_Vector &gridWidth, bool drawGridWithoutGaps, int totalPoints) { |
| | m_gridLattice->update(30, 60, gridWidth, totalPoints); |
| | if (drawGridWithoutGaps){ |
| | fillPointsNoGaps(min, max); |
| | } |
| | else { |
| | if (drawTopLines) { |
| | fillTilesRowsByPointsExceptDiagonal(); |
| | } else { |
| | fillTilesRowsByPoints(); |
| | } |
| | } |
| | } |
| |
|
| | void LC_IsometricGrid::prepareSnapSolution() { |
| | gridDeltaX = m_gridLattice->getDeltaX(); |
| | gridDeltaY = m_gridLattice->getDeltaY(); |
| | snapVectorSolution = RS_VectorSolutions({RS_Vector(0,0), gridDeltaY, gridDeltaX, -gridDeltaX, -gridDeltaY}); |
| | } |
| |
|
| | void LC_IsometricGrid::calculateTilesGridMetrics(const RS_Vector &maxCorner, const RS_Vector &offset) { |
| | double metaHorizontalX = isometricCell.x / 2; |
| | double metaVerticalY = isometricCell.y / 2; |
| | double minX = m_metaGridMin.x - isometricCell.x; |
| | double minY = m_metaGridMin.y - isometricCell.y; |
| |
|
| | tileNumPointsByX = m_numPointsInMetagridX; |
| | tileNumPointsByY = m_numPointsInMetagridY; |
| |
|
| | |
| | if (!drawRightLine) { |
| | tileNumPointsByY++; |
| | } |
| |
|
| | if (!drawLeftLine) { |
| | tileNumPointsByX++; |
| | } |
| |
|
| | tilesRowShift = metaHorizontalX / 2; |
| | bool firstRowIsNearToMin = std::abs(offset.y) < metaVerticalY; |
| | if (firstRowIsNearToMin) { |
| | double shift = metaHorizontalX; |
| | if (metaHorizontalX > offset.x) { |
| | shift = -metaHorizontalX; |
| | } |
| | tilesStartPoint = RS_Vector(minX + shift - tilesRowShift, minY); |
| | } else { |
| | double shift = 0; |
| | if (metaHorizontalX > offset.x) { |
| | shift = metaHorizontalX; |
| | } |
| | tilesStartPoint = RS_Vector(minX + shift - metaHorizontalX * 2 + tilesRowShift, minY - metaVerticalY); |
| | } |
| | tilesMaxPoint = RS_Vector(maxCorner.x + metaHorizontalX, maxCorner.y); |
| |
|
| | tilesDelta = RS_Vector(isometricCell.x, metaVerticalY); |
| | } |
| |
|
| |
|
| | void LC_IsometricGrid::fillTilesRowsByPointsExceptDiagonal() { |
| | RS_Vector startPoint = tilesStartPoint; |
| | double currentY = startPoint.y; |
| | RS_Vector basePoint = startPoint; |
| |
|
| | double maxX = tilesMaxPoint.x; |
| | double maxY = tilesMaxPoint.y; |
| | double rowShift = tilesRowShift; |
| |
|
| | double tilesDeltaX = tilesDelta.x; |
| | double tilesDeltaY = tilesDelta.y; |
| |
|
| | while (currentY < maxY) { |
| | double currentX = startPoint.x - rowShift; |
| | basePoint.x = currentX; |
| | while (currentX < maxX) { |
| | m_gridLattice->fillWithoutDiagonal(tileNumPointsByX, tileNumPointsByY, basePoint, false, false, true, m_numPointsInMetagridX); |
| | currentX += tilesDeltaX; |
| | basePoint.x = currentX; |
| | } |
| | currentY += tilesDeltaY; |
| | basePoint.y = currentY; |
| | rowShift = -rowShift; |
| | } |
| | } |
| |
|
| | void LC_IsometricGrid::fillTilesRowsByPoints() { |
| | RS_Vector startPoint = tilesStartPoint; |
| | double currentY = startPoint.y; |
| | RS_Vector basePoint = startPoint; |
| |
|
| | double maxX = tilesMaxPoint.x; |
| | double maxY = tilesMaxPoint.y; |
| | double rowShift = tilesRowShift; |
| | double tilesDeltaX = tilesDelta.x; |
| | double tilesDeltaY = tilesDelta.y; |
| |
|
| | while (currentY < maxY) { |
| | double currentX = startPoint.x - rowShift; |
| | basePoint.x = currentX; |
| | while (currentX < maxX) { |
| | m_gridLattice->fill(tileNumPointsByX, tileNumPointsByY, basePoint, false, false); |
| | currentX += tilesDeltaX; |
| | basePoint.x = currentX; |
| | } |
| | currentY += tilesDeltaY; |
| | basePoint.y = currentY; |
| | rowShift = -rowShift; |
| | } |
| | } |
| |
|
| | void LC_IsometricGrid::fillTilesRowsByLinesNoDiagonals() { |
| | RS_Vector startPoint = tilesStartPoint; |
| | double currentY = startPoint.y; |
| | RS_Vector basePoint = startPoint; |
| |
|
| | double maxX = tilesMaxPoint.x; |
| | double maxY = tilesMaxPoint.y; |
| | double rowShift = tilesRowShift; |
| |
|
| | double tilesDeltaX = tilesDelta.x; |
| | double tilesDeltaY = tilesDelta.y; |
| |
|
| | int numPointsX = tileNumPointsByX; |
| | int numPointsY = tileNumPointsByY; |
| |
|
| | if (!drawRightLine){ |
| | numPointsY --; |
| | } |
| | if (!drawLeftLine){ |
| | numPointsX --; |
| | } |
| |
|
| | while (currentY < maxY) { |
| | double currentX = startPoint.x - rowShift; |
| | basePoint.x = currentX; |
| | while (currentX < maxX) { |
| | m_gridLattice->fillAllByLinesExceptDiagonal(numPointsX, numPointsY, basePoint, false, false, !drawLeftLine, !drawRightLine); |
| | currentX += tilesDeltaX; |
| | basePoint.x = currentX; |
| | } |
| | currentY += tilesDeltaY; |
| | basePoint.y = currentY; |
| | rowShift = -rowShift; |
| | } |
| | } |
| |
|
| | void LC_IsometricGrid::fillTilesRowsBylines() { |
| | RS_Vector startPoint = tilesStartPoint; |
| | double currentY = startPoint.y; |
| | RS_Vector basePoint = startPoint; |
| |
|
| | double maxX = tilesMaxPoint.x; |
| | double maxY = tilesMaxPoint.y; |
| | double rowShift = tilesRowShift; |
| |
|
| | double tilesDeltaX = tilesDelta.x; |
| | double tilesDeltaY = tilesDelta.y; |
| |
|
| | while (currentY < maxY) { |
| | double currentX = startPoint.x - rowShift; |
| | basePoint.x = currentX; |
| | while (currentX < maxX) { |
| | m_gridLattice->fillByLines(tileNumPointsByX, tileNumPointsByY, basePoint, false, false, !drawLeftLine, !drawRightLine); |
| | currentX += tilesDeltaX; |
| | basePoint.x = currentX; |
| | } |
| | currentY += tilesDeltaY; |
| | basePoint.y = currentY; |
| | rowShift = -rowShift; |
| | } |
| | } |
| |
|
| | void LC_IsometricGrid::fillPointsNoGaps(const RS_Vector &min, const RS_Vector &max) { |
| | RS_Vector deltaX = m_gridLattice->getDeltaX(); |
| | RS_Vector deltaY = m_gridLattice->getDeltaY(); |
| | double pointsDeltaX = deltaX.x; |
| | double pointsDeltaY = deltaY.y; |
| |
|
| | RS_Vector leftBottomCorner = RS_Vector(min.x, max.y); |
| |
|
| | RS_Vector offset = leftBottomCorner-m_metaGridMin; |
| |
|
| | double startX = min.x - remainder(offset.x, pointsDeltaX*2)+pointsDeltaX/2; |
| | double startY = max.y - remainder(offset.y, pointsDeltaY*2)+pointsDeltaY; |
| |
|
| | double maxX = max.x; |
| |
|
| | double shiftByX = pointsDeltaX*2; |
| | double rowShift = deltaY.x/2; |
| | double currentY = startY; |
| | while (currentY < min.y) { |
| | double currentX = startX - rowShift; |
| | while (currentX < maxX) { |
| | m_gridLattice->addPoint(currentX, currentY); |
| | currentX += shiftByX; |
| | } |
| | currentY += pointsDeltaY; |
| | rowShift = -rowShift; |
| | } |
| | } |
| |
|