void generateSliceXYpoints(sliceExtractData *sliceData, modOrigin modelOrigin, sliceExtent sliceBounds) { int nBranches = sliceBounds.nSections; int nGrdPts; double deltaLat; double deltaLon; int count = 0; double distX, distY; double locationXY[2]; double dLatRot, dLonRot; singleGridPoint rotatedGridPoint; for(int i = 0; i < nBranches; i++) { nGrdPts = sliceBounds.resXY; deltaLat = (sliceBounds.latPtsSlice[i]-sliceBounds.latPtsSlice[i+1])/nGrdPts; deltaLon = (sliceBounds.lonPtsSlice[i]-sliceBounds.lonPtsSlice[i+1])/nGrdPts; for(int j = 0; j < nGrdPts+1; j++) { sliceData->lonPts[count] = sliceBounds.lonPtsSlice[i]-j*deltaLon; sliceData->latPts[count] = sliceBounds.latPtsSlice[i]-j*deltaLat; locationXY[0] = modelOrigin.mlat; locationXY[1] = sliceData->lonPts[count]; distX = LatLonToDistance(locationXY, modelOrigin); locationXY[0] =sliceData->latPts[count]; locationXY[1] = modelOrigin.mlon; distY = LatLonToDistance(locationXY, modelOrigin); dLatRot = modelOrigin.mlat - sliceData->latPts[count]; dLonRot = modelOrigin.mlon - sliceData->lonPts[count]; if(dLatRot < 0) { distY = -distY; } if (dLonRot > 0) { distX = - distX; } rotatedGridPoint = rotateGrid(modelOrigin.mrot, distX, distY); sliceData->xPts[count] = rotatedGridPoint.X; sliceData->yPts[count] = rotatedGridPoint.Y; // printf("%lf %lf\n",sliceData->xPts[count],sliceData->yPts[count]); count += 1; } } sliceData->nPts = count; assert(sliceData->nPts<=MAX_NUM_SLICE_GRIDPTS); }
void GridTool::update(double deltaTime){ MsbTool::update(deltaTime); if (!bPressLeft || input->hudTarget) return; if (gridMove==GRID_ROTATE){ if (bPressLeft) rotateGrid(deltaTime); return; } sceneData->grid->bPickable=false; if (gridMove==GRID_ABSOLUTE){ sceneData->grid->setLocation(input->mouse3D); gridX=Vector3f(-1,0,0); gridY=Vector3f(0,1,0); gridZ=Vector3f(0,0,-1); } if (gridMove==GRID_NORMAL){ sceneData->grid->setLocation(input->mouse3D); if (input->worldNormal!=Vector3f(0,1,0)){ gridZ=input->worldNormal; gridZ.normalize(); gridX=gridZ.crossProduct(Vector3f(0,1,0)); gridX.normalize(); gridY= gridZ.crossProduct(gridX); gridY.normalize(); } else if (input->worldNormal!=Vector3f(0,0,0)){ gridY= input->worldNormal; gridY.normalize(); gridX= gridY.crossProduct(Vector3f(0,0,1)); gridX.normalize(); gridZ= gridY.crossProduct(gridX); gridZ.normalize(); }else{ input->worldNormal=Vector3f(0,1,0); gridY= input->worldNormal; gridY.normalize(); gridX= gridY.crossProduct(Vector3f(0,0,1)); gridX.normalize(); gridZ= gridY.crossProduct(gridX); gridZ.normalize(); } } }
void Maze::drawLines(float * color, int x, int y, float pointX, float pointY) { glLineWidth(1.0); std::bitset<9> grid; grid[0] = isWall(x-1, y-1); grid[1] = isWall(x+0, y-1); grid[2] = isWall(x+1, y-1); grid[3] = isWall(x-1, y+0); grid[4] = isWall(x+0, y+0); grid[5] = isWall(x+1, y+0); grid[6] = isWall(x-1, y+1); grid[7] = isWall(x+0, y+1); grid[8] = isWall(x+1, y+1); float size = 0.50; float rawPointX = pointX; float rawPointY = pointY; pointX += (1.0 - size) / 2.0; pointY += (1.0 - size) / 2.0; std::vector<point> points; float z = -19; int counter = 0; int toDraw = -1; while (true) { int drawType = counter / 4; float rotation = (counter % 4) * 90; switch (drawType) { case 0: // Small wall if (!grid[1] && !grid[7] && grid[3] && grid[5]) toDraw = 0; break; case 1: // Small end if (!grid[1] && !grid[7] && grid[5]) toDraw = 1; break; case 2: // 90 degree corner if (!grid[1] && grid[7] && !grid[3] && grid[5] && !grid[8]) toDraw = 2; break; case 3: // Big wall if (!grid[1] && grid[7] && grid[3] && grid[5]) toDraw = 3; break; case 4: // Big corner if (!grid[1] && grid[7] && !grid[3] && grid[5]) toDraw = 4; break; case 5: // Big inset if (grid.count() == 8 && !grid[0]) toDraw = 5; break; default: return; } if (toDraw > -1) { glPushMatrix(); glTranslatef(rawPointX+0.5, rawPointY+0.5, z); glRotatef(rotation, 0, 0, 1); switch (toDraw) { case 0: // Small wall drawSmallWall(); break; case 1: // Small end drawSmallEnd(); break; case 2: // 90 degree corner drawSmallCorner(); break; case 3: // Big wall drawBigWall(); break; case 4: // Big corner drawBigCorner(false); break; case 5: // Big inset glRotatef(180, 0, 0, 1); drawBigCorner(true); break; } glRotatef(0 - rotation, 0, 0, 1); glPopMatrix(); return; } grid = rotateGrid(grid); counter++; } }