xref: /petsc/src/sys/classes/draw/interface/drect.c (revision 20f4b53cbb5e9bd9ef12b76a8697d60d197cda17)
1af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
25c6c1daeSBarry Smith 
35c6c1daeSBarry Smith /*@C
4811af0c4SBarry Smith    PetscDrawIndicatorFunction - Draws an indicator function (where a relationship is true) on a `PetscDraw`
55c6c1daeSBarry Smith 
6*20f4b53cSBarry Smith    Not Collective
75c6c1daeSBarry Smith 
8d8d19677SJose E. Roman    Input Parameters:
9811af0c4SBarry Smith +  draw - a `PetscDraw`
105c6c1daeSBarry Smith .  xmin,xmax,ymin,ymax - region to draw indicator function
115c6c1daeSBarry Smith -  f - the indicator function
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith    Level: developer
145c6c1daeSBarry Smith 
15811af0c4SBarry Smith .seealso: `PetscDraw`
165c6c1daeSBarry Smith @*/
17d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawIndicatorFunction(PetscDraw draw, PetscReal xmin, PetscReal xmax, PetscReal ymin, PetscReal ymax, int c, PetscErrorCode (*indicator)(void *, PetscReal, PetscReal, PetscBool *), void *ctx)
18d71ae5a4SJacob Faibussowitsch {
19a7e8706aSLisandro Dalcin   int       i, j, xstart, ystart, xend, yend;
205c6c1daeSBarry Smith   PetscReal x, y;
215c6c1daeSBarry Smith   PetscBool isnull, flg;
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith   PetscFunctionBegin;
245c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
259566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
263ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
275c6c1daeSBarry Smith 
289566063dSJacob Faibussowitsch   PetscCall(PetscDrawCoordinateToPixel(draw, xmin, ymin, &xstart, &ystart));
299566063dSJacob Faibussowitsch   PetscCall(PetscDrawCoordinateToPixel(draw, xmax, ymax, &xend, &yend));
309371c9d4SSatish Balay   if (yend < ystart) {
319371c9d4SSatish Balay     PetscInt tmp = ystart;
329371c9d4SSatish Balay     ystart       = yend;
339371c9d4SSatish Balay     yend         = tmp;
349371c9d4SSatish Balay   }
3545f3bb6eSLisandro Dalcin 
3645f3bb6eSLisandro Dalcin   for (i = xstart; i <= xend; i++) {
3745f3bb6eSLisandro Dalcin     for (j = ystart; j <= yend; j++) {
389566063dSJacob Faibussowitsch       PetscCall(PetscDrawPixelToCoordinate(draw, i, j, &x, &y));
399566063dSJacob Faibussowitsch       PetscCall(indicator(ctx, x, y, &flg));
401baa6e33SBarry Smith       if (flg) PetscCall(PetscDrawPointPixel(draw, i, j, c));
415c6c1daeSBarry Smith     }
425c6c1daeSBarry Smith   }
433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
445c6c1daeSBarry Smith }
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith /*@C
47811af0c4SBarry Smith    PetscDrawCoordinateToPixel - given a coordinate in a `PetscDraw` returns the pixel location
485c6c1daeSBarry Smith 
49*20f4b53cSBarry Smith    Not Collective
505c6c1daeSBarry Smith 
515c6c1daeSBarry Smith    Input Parameters:
525c6c1daeSBarry Smith +  draw - the draw where the coordinates are defined
536b867d5aSJose E. Roman .  x - the horizontal coordinate
546b867d5aSJose E. Roman -  y - the vertical coordinate
555c6c1daeSBarry Smith 
565c6c1daeSBarry Smith    Output Parameters:
576b867d5aSJose E. Roman +  i - the horizontal pixel location
586b867d5aSJose E. Roman -  j - the vertical pixel location
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith    Level: developer
615c6c1daeSBarry Smith 
62811af0c4SBarry Smith .seealso: `PetscDraw`
635c6c1daeSBarry Smith @*/
64d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawCoordinateToPixel(PetscDraw draw, PetscReal x, PetscReal y, int *i, int *j)
65d71ae5a4SJacob Faibussowitsch {
665c6c1daeSBarry Smith   PetscFunctionBegin;
675c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
68dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, coordinatetopixel, x, y, i, j);
693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
705c6c1daeSBarry Smith }
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith /*@C
73811af0c4SBarry Smith    PetscDrawPixelToCoordinate - given a pixel in a `PetscDraw` returns the coordinate
745c6c1daeSBarry Smith 
75*20f4b53cSBarry Smith    Not Collective
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith    Input Parameters:
785c6c1daeSBarry Smith +  draw - the draw where the coordinates are defined
796b867d5aSJose E. Roman .  i - the horizontal pixel location
806b867d5aSJose E. Roman -  j - the vertical pixel location
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith    Output Parameters:
836b867d5aSJose E. Roman +  x - the horizontal coordinate
846b867d5aSJose E. Roman -  y - the vertical coordinate
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith    Level: developer
875c6c1daeSBarry Smith 
88811af0c4SBarry Smith .seealso: `PetscDraw`
895c6c1daeSBarry Smith @*/
90d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawPixelToCoordinate(PetscDraw draw, int i, int j, PetscReal *x, PetscReal *y)
91d71ae5a4SJacob Faibussowitsch {
925c6c1daeSBarry Smith   PetscFunctionBegin;
935c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
94dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, pixeltocoordinate, i, j, x, y);
953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
965c6c1daeSBarry Smith }
975c6c1daeSBarry Smith 
985c6c1daeSBarry Smith /*@
99811af0c4SBarry Smith    PetscDrawRectangle - draws a rectangle  onto a drawable.
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith    Not Collective
1025c6c1daeSBarry Smith 
1035c6c1daeSBarry Smith    Input Parameters:
1045c6c1daeSBarry Smith +  draw - the drawing context
1055c6c1daeSBarry Smith .  xl,yl,xr,yr - the coordinates of the lower left, upper right corners
1065c6c1daeSBarry Smith -  c1,c2,c3,c4 - the colors of the four corners in counter clockwise order
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith    Level: beginner
1095c6c1daeSBarry Smith 
110811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawLine()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
111db781477SPatrick Sanan           `PetscDrawMarker()`, `PetscDrawPoint()`, `PetscDrawString()`, `PetscDrawPoint()`, `PetscDrawArrow()`
1125c6c1daeSBarry Smith @*/
113d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRectangle(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr, int c1, int c2, int c3, int c4)
114d71ae5a4SJacob Faibussowitsch {
1155c6c1daeSBarry Smith   PetscFunctionBegin;
1165c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
117dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, rectangle, xl, yl, xr, yr, c1, c2, c3, c4);
1183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1195c6c1daeSBarry Smith }
120