xref: /petsc/src/sys/classes/draw/interface/drect.c (revision 1baa6e3354bfe224b33a0c158f482508792a8a6e)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
45c6c1daeSBarry Smith */
5af0996ceSBarry Smith #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith /*@C
85c6c1daeSBarry Smith    PetscDrawIndicatorFunction - Draws an indicator function (where a relationship is true) on a PetscDraw
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith    Not collective
115c6c1daeSBarry Smith 
12d8d19677SJose E. Roman    Input Parameters:
135c6c1daeSBarry Smith +  draw - a PetscDraw
145c6c1daeSBarry Smith .  xmin,xmax,ymin,ymax - region to draw indicator function
155c6c1daeSBarry Smith -  f - the indicator function
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith    Level: developer
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith @*/
2045f3bb6eSLisandro Dalcin PetscErrorCode PetscDrawIndicatorFunction(PetscDraw draw,PetscReal xmin,PetscReal xmax,PetscReal ymin,PetscReal ymax,int c,PetscErrorCode (*indicator)(void*,PetscReal,PetscReal,PetscBool*),void *ctx)
215c6c1daeSBarry Smith {
22a7e8706aSLisandro Dalcin   int            i,j,xstart,ystart,xend,yend;
235c6c1daeSBarry Smith   PetscReal      x,y;
245c6c1daeSBarry Smith   PetscBool      isnull,flg;
255c6c1daeSBarry Smith 
265c6c1daeSBarry Smith   PetscFunctionBegin;
275c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
289566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw,&isnull));
295c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
305c6c1daeSBarry Smith 
319566063dSJacob Faibussowitsch   PetscCall(PetscDrawCoordinateToPixel(draw,xmin,ymin,&xstart,&ystart));
329566063dSJacob Faibussowitsch   PetscCall(PetscDrawCoordinateToPixel(draw,xmax,ymax,&xend,&yend));
3345f3bb6eSLisandro Dalcin   if (yend < ystart) { PetscInt tmp = ystart; ystart = yend; yend = tmp; }
3445f3bb6eSLisandro Dalcin 
3545f3bb6eSLisandro Dalcin   for (i=xstart; i<=xend; i++) {
3645f3bb6eSLisandro Dalcin     for (j=ystart; j<=yend; j++) {
379566063dSJacob Faibussowitsch       PetscCall(PetscDrawPixelToCoordinate(draw,i,j,&x,&y));
389566063dSJacob Faibussowitsch       PetscCall(indicator(ctx,x,y,&flg));
39*1baa6e33SBarry Smith       if (flg) PetscCall(PetscDrawPointPixel(draw,i,j,c));
405c6c1daeSBarry Smith     }
415c6c1daeSBarry Smith   }
425c6c1daeSBarry Smith   PetscFunctionReturn(0);
435c6c1daeSBarry Smith }
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith /*@C
465c6c1daeSBarry Smith    PetscDrawCoordinateToPixel - given a coordinate in a PetscDraw returns the pixel location
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith    Not collective
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith    Input Parameters:
515c6c1daeSBarry Smith +  draw - the draw where the coordinates are defined
526b867d5aSJose E. Roman .  x - the horizontal coordinate
536b867d5aSJose E. Roman -  y - the vertical coordinate
545c6c1daeSBarry Smith 
555c6c1daeSBarry Smith    Output Parameters:
566b867d5aSJose E. Roman +  i - the horizontal pixel location
576b867d5aSJose E. Roman -  j - the vertical pixel location
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith    Level: developer
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith @*/
62a7e8706aSLisandro Dalcin PetscErrorCode PetscDrawCoordinateToPixel(PetscDraw draw,PetscReal x,PetscReal y,int *i,int *j)
635c6c1daeSBarry Smith {
645c6c1daeSBarry Smith   PetscFunctionBegin;
655c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
6628b400f6SJacob Faibussowitsch   PetscCheck(draw->ops->coordinatetopixel,PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support locating pixels",((PetscObject)draw)->type_name);
679566063dSJacob Faibussowitsch   PetscCall((*draw->ops->coordinatetopixel)(draw,x,y,i,j));
685c6c1daeSBarry Smith   PetscFunctionReturn(0);
695c6c1daeSBarry Smith }
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith /*@C
725c6c1daeSBarry Smith    PetscDrawPixelToCoordinate - given a pixel in a PetscDraw returns the coordinate
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith    Not collective
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith    Input Parameters:
775c6c1daeSBarry Smith +  draw - the draw where the coordinates are defined
786b867d5aSJose E. Roman .  i - the horizontal pixel location
796b867d5aSJose E. Roman -  j - the vertical pixel location
805c6c1daeSBarry Smith 
815c6c1daeSBarry Smith    Output Parameters:
826b867d5aSJose E. Roman +  x - the horizontal coordinate
836b867d5aSJose E. Roman -  y - the vertical coordinate
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith    Level: developer
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith @*/
88a7e8706aSLisandro Dalcin PetscErrorCode PetscDrawPixelToCoordinate(PetscDraw draw,int i,int j,PetscReal *x,PetscReal *y)
895c6c1daeSBarry Smith {
905c6c1daeSBarry Smith   PetscFunctionBegin;
915c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
9228b400f6SJacob Faibussowitsch   PetscCheck(draw->ops->pixeltocoordinate,PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support locating coordinates",((PetscObject)draw)->type_name);
939566063dSJacob Faibussowitsch   PetscCall((*draw->ops->pixeltocoordinate)(draw,i,j,x,y));
945c6c1daeSBarry Smith   PetscFunctionReturn(0);
955c6c1daeSBarry Smith }
965c6c1daeSBarry Smith 
975c6c1daeSBarry Smith /*@
985c6c1daeSBarry Smith    PetscDrawRectangle - PetscDraws a rectangle  onto a drawable.
995c6c1daeSBarry Smith 
1005c6c1daeSBarry Smith    Not Collective
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith    Input Parameters:
1035c6c1daeSBarry Smith +  draw - the drawing context
1045c6c1daeSBarry Smith .  xl,yl,xr,yr - the coordinates of the lower left, upper right corners
1055c6c1daeSBarry Smith -  c1,c2,c3,c4 - the colors of the four corners in counter clockwise order
1065c6c1daeSBarry Smith 
1075c6c1daeSBarry Smith    Level: beginner
1085c6c1daeSBarry Smith 
109db781477SPatrick Sanan .seealso: `PetscDrawLine()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
110db781477SPatrick Sanan           `PetscDrawMarker()`, `PetscDrawPoint()`, `PetscDrawString()`, `PetscDrawPoint()`, `PetscDrawArrow()`
111ba1e01c4SBarry Smith 
1125c6c1daeSBarry Smith @*/
1135c6c1daeSBarry Smith PetscErrorCode  PetscDrawRectangle(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c1,int c2,int c3,int c4)
1145c6c1daeSBarry Smith {
1155c6c1daeSBarry Smith   PetscFunctionBegin;
1165c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
11728b400f6SJacob Faibussowitsch   PetscCheck(draw->ops->rectangle,PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing rectangles",((PetscObject)draw)->type_name);
1189566063dSJacob Faibussowitsch   PetscCall((*draw->ops->rectangle)(draw,xl,yl,xr,yr,c1,c2,c3,c4));
1195c6c1daeSBarry Smith   PetscFunctionReturn(0);
1205c6c1daeSBarry Smith }
121