long GridWndMover_c::GetVelocityIndex(WorldPoint p) { long rowNum, colNum; VelocityRec velocity; LongRect gridLRect, geoRect; ScaleRec thisScaleRec; TRectGridVel* rectGrid = (TRectGridVel*)fGrid; // fNumRows, fNumCols members of GridWndMover WorldRect bounds = rectGrid->GetBounds(); SetLRect (&gridLRect, 0, fNumRows, fNumCols, 0); SetLRect (&geoRect, bounds.loLong, bounds.loLat, bounds.hiLong, bounds.hiLat); GetLScaleAndOffsets (&geoRect, &gridLRect, &thisScaleRec); colNum = p.pLong * thisScaleRec.XScale + thisScaleRec.XOffset; rowNum = p.pLat * thisScaleRec.YScale + thisScaleRec.YOffset; if (colNum < 0 || colNum >= fNumCols || rowNum < 0 || rowNum >= fNumRows) { return -1; } return rowNum * fNumCols + colNum; }
void TimeGridWindRect::Draw(Rect r, WorldRect view, double refScale, double arrowScale,double arrowDepth, Boolean bDrawArrows, Boolean bDrawGrid, RGBColor arrowColor) { // Use this for regular grid short row, col, pixX, pixY; long dLong, dLat, index, timeDataInterval; float inchesX, inchesY; double timeAlpha; Seconds startTime, endTime, time = model->GetModelTime(); Point p, p2; WorldPoint wp; WorldRect boundsRect, bounds; VelocityRec velocity; Rect c, newGridRect = {0, 0, fNumRows - 1, fNumCols - 1}; // fNumRows, fNumCols members of TimeGridVel Boolean offQuickDrawPlane = false, loaded; char errmsg[256]; OSErr err = 0; TRectGridVel* rectGrid = (TRectGridVel*)fGrid; if (!bDrawArrows && !bDrawGrid) return; bounds = rectGrid->GetBounds(); // need to get the bounds from the grid dLong = (WRectWidth(bounds) / fNumCols) / 2; dLat = (WRectHeight(bounds) / fNumRows) / 2; //RGBForeColor(&colors[PURPLE]); RGBForeColor(&arrowColor); boundsRect = bounds; InsetWRect (&boundsRect, dLong, dLat); if (bDrawArrows) { err = this -> SetInterval(errmsg, model->GetModelTime()); // AH 07/17/2012 if(err && !bDrawGrid) return; // want to show grid even if there's no wind data loaded = this -> CheckInterval(timeDataInterval, model->GetModelTime()); if(!loaded && !bDrawGrid) return; if((GetNumTimesInFile()>1 || GetNumFiles()>1) && loaded && !err) { // Calculate the time weight factor if (GetNumFiles()>1 && fOverLap) startTime = fOverLapStartTime + fTimeShift; else startTime = (*fTimeHdl)[fStartData.timeIndex] + fTimeShift; if (fEndData.timeIndex == UNASSIGNEDINDEX && (time > startTime || time < startTime) && fAllowExtrapolationInTime) { timeAlpha = 1; } else { //return false; endTime = (*fTimeHdl)[fEndData.timeIndex] + fTimeShift; timeAlpha = (endTime - time)/(double)(endTime - startTime); } } } for (row = 0 ; row < fNumRows ; row++) for (col = 0 ; col < fNumCols ; col++) { SetPt(&p, col, row); wp = ScreenToWorldPoint(p, newGridRect, boundsRect); velocity.u = velocity.v = 0.; if (loaded && !err) { index = dynamic_cast<TimeGridWindRect *>(this)->GetVelocityIndex(wp); if (bDrawArrows && index >= 0) { // Check for constant wind pattern if((GetNumTimesInFile()==1 && !(GetNumFiles()>1)) || timeAlpha==1) { velocity.u = INDEXH(fStartData.dataHdl,index).u; velocity.v = INDEXH(fStartData.dataHdl,index).v; } else // time varying wind { velocity.u = timeAlpha*INDEXH(fStartData.dataHdl,index).u + (1-timeAlpha)*INDEXH(fEndData.dataHdl,index).u; velocity.v = timeAlpha*INDEXH(fStartData.dataHdl,index).v + (1-timeAlpha)*INDEXH(fEndData.dataHdl,index).v; } } } p = GetQuickDrawPt(wp.pLong, wp.pLat, &r, &offQuickDrawPlane); MySetRect(&c, p.h - 1, p.v - 1, p.h + 1, p.v + 1); if (bDrawGrid && bDrawArrows && (velocity.u != 0 || velocity.v != 0)) PaintRect(&c); // should check fill_value if (bDrawGrid && !bDrawArrows) PaintRect(&c); // should check fill_value if (bDrawArrows && (velocity.u != 0 || velocity.v != 0)) { inchesX = (velocity.u * refScale) / arrowScale; inchesY = (velocity.v * refScale) / arrowScale; pixX = inchesX * PixelsPerInchCurrent(); pixY = inchesY * PixelsPerInchCurrent(); p2.h = p.h + pixX; p2.v = p.v - pixY; MyMoveTo(p.h, p.v); MyLineTo(p2.h, p2.v); MyDrawArrow(p.h,p.v,p2.h,p2.v); } } RGBForeColor(&colors[BLACK]); }