Navigation:  DPLOTLIB Functions >

DPlot_GetBitmapEx function

Print this Topic Previous pageReturn to chapter overviewNext page

HBITMAP DPlot_GetBitmapEx(int DocNum, int cx, int cy, DPLOT_PLOTMETRICS *DPM);

Parameters

DocNum

Document index for the document that you want a bitmap picture of (1-32). In practice this will generally (though not necessarily) be the return value of a call to DPlot_Plot.

cx, cy

Requested width and height of the bitmap, in pixels.

*DPM

Address of a DPLOT_PLOTMETRICS structure (see below). The size member of this structure should be set by the caller prior to calling this function. If *DPM is set to NULL, this information is not returned and this function is identical to DPlot_GetBitmap.

Return Values

 0

Generic error attempting to communicate with DPlot. This most often indicates that DPlot is currently busy, e.g. a modal dialog box is open.

<>0

Handle to a device-dependent bitmap. This picture may be drawn in your application with the Windows API functions BitBlt and/or StretchBlt

Remarks

Palette information is not returned, so this function does not work particularly well with 256 (or fewer) color displays.

DPLOT_PLOTMETRICS

 

In C:

typedef struct tagDPLOT_PLOTMETRICS

{

    DWORD   size;       // size of this structure; should be set by the caller

    int     hll;        // horizontal and

    int     vll;        //  vertical coordinates of the lower left corner of

                        //  the plot, in pixels

    int     hur;        // horizontal and

    int     vur;        //  vertical coordinates of the upper right corner of

                        //  the plot, in pixels

    float   xlo;        // value of X at the left plot extent

    float   ylo;        // value of Y at the bottom plot extent

    float   xhi;        // value of X at the right plot extent

    float   yhi;        // value of Y at the top plot extent

    float   stretch[3]; // scale factors for X, Y, and Z w/ 3D plots

    float   scale;      // scale factor for projection of 3D points

    float   azimuth;    // view angles for 3D views, radians

    float   elevation;

    float   ylo2;       // Y extents of 2nd Y axis, if any

    float   yhi2;

} DPLOT_PLOTMETRICS

In Visual Basic:

Type DPLOT_PLOTMETRICS

    size As Long          ' size of this structure

    hll As Long           ' horizontal and

    vll As Long           '  vertical coordinates of the lower left corner of

                          '  the plot, in pixels

    hur As Long           ' horizontal and

    vur As Long           '  vertical coordinates of the upper right corner of

                          '  the plot, in pixels

    xlo As Single         ' value of X at the left plot extent

    ylo As Single         ' value of Y at the bottom plot extent

    xhi As Single         ' value of X at the right plot extent

    yhi As Single         ' value of Y at the top plot extent

    stretch(3) As Single  ' scale factors for X, Y, and Z w/ 3D plots

    scale As Single       ' scale factor for projection of 3D points

    azimuth As Single     ' view angles for 3D views, radians

    elevation As Single

    ylo2 As Single        ' Y extents of 2nd Y axis, if any

    yhi2 As Single

End Type

Using DPLOT_PLOTMETRICS

The information returned in this structure can be used to translate pixel coordinates (mouse position, for example) into X,Y coordinates in data space. The btest2 Visual Basic and ctest2 C demos illustrate this functionality for linear scales. Translating pixels to X and Y for various scaling types is described below in Visual Basic terminology. In all cases, x and y are the pixel coordinates of interest (0,0 is at the upper left corner of the bitmap), wx and wy are the translated X and Y values; DPM is the DPLOT_PLOTMETRICS structure returned by DPlot_GetBitmapEx. Reverse scaling probability plots is outside the scope of this documentation.

 

Linear X:

   wx = DPM.xlo + (x - DPM.hll) * (DPM.xhi - DPM.xlo) /(DPM.hur - DPM.hll)

Linear Y:

   wy = DPM.ylo + (y - DPM.vll) * (DPM.yhi - DPM.ylo) / (DPM.vur - DPM.vll)

Logarithmic X:

   wx = DPM.xlo * (DPM.xhi/DPM.xlo) ^ ( (x-DPM.hll)/(DPM.hur-DPM.hll) )

Logarithmic Y:

   wy = DPM.ylo * (DPM.yhi/DPM.ylo) ^ ( (y-DPM.vll)/(DPM.vur-DPM.vll) )

Polar coordinates:

   xp = ( x - ( DPM.hll +DPM.hur )/2. ) * 2.0 * _

        ( DPM.yhi - DPM.ylo ) / ( DPM.hur - DPM.hll ) + DPM.ylo

   yp = ( y - ( DPM.vll +DPM.vur )/2. ) * 2.0 * _

        ( DPM.yhi - DPM.ylo ) / ( DPM.vur - DPM.vll ) + DPM.ylo

  If xp = 0 Then

    If yp < 0 Then

       alpha = -90

    Else

       alpha = 90

    End If

  Elseif xp < 0 then

     alpha = atn(yp/xp) * 180. / PI - 180.

  Else

     alpha = atn(yp/xp) * 180. / PI

  End If

  If alpha < 0. Then

     alpha = 360 + alpha

  End If

   radius = sqr(xp^2 + yp^2)

Triangle plot:

   wy = 100 * (DPM.vll-y) / (DPM.vll-DPM.vur)

   wx = 100 * ( (x-DPM.hll) - 0.01*wy*(DPM.vll-DPM.vur)*0.5773502691896) / _

              (DPM.hur-DPM.hll)

N185 Hydraulic scale:

   wx = ( (x - DPM.hll) * (DPM.xhi^1.85 - DPM.xlo^1.85) / _

        (DPM.hur-DPM.hll) + DPM.xlo^1.85 )^(1.0/1.85)

Getting pixel values for projected 3D points

This procedure might be useful if you want to draw your own symbols or other graphics on a bitmap of a 3D projection returned by DPlot. The following example is in Visual Basic:

 

Dim DPM As DPLOT_PLOTMETRICS

Dim ct(3) As Double

Dim st(3) As Double

Private Sub AngleTransforms()

  Dim roll As Double

  Dim yaw As Double

  If (DPM.azimuth = PI / 2) Then

       ct(2) = 0

       st(2) = 1

  ElseIf (DPM.azimuth = 3 * PI / 2) Then

       ct(2) = 0

       st(2) = -1

  Else

       ct(2) = Cos(DPM.azimuth)

       st(2) = Sin(DPM.azimuth)

  End If

   roll = DPM.elevation * st(2)

   yaw = 1.5 * PI + DPM.elevation * ct(2)

'   Find angles from midpoint to viewpoint:

   ct(0) = Cos(yaw)

   st(0) = Sin(yaw)

   ct(1) = Cos(roll)

   st(1) = Sin(roll)

'   Force roll angle to keep vertical lines vertical

  If (ct(2) <> 0 And st(0) <> 0) Then

       st(1) = -st(2) * ct(0) / (ct(2) * st(0))

      If (Abs(st(1)) >= 1) Then

          If (st(1) < 0) Then

               st(1) = -1

          Else

               st(1) = 1

          End If

      Else

           ct(1) = Sqr(1 - st(1) * st(1))

      End If

  End If

End Sub

Private Sub Transform3D(Xin As Double, Yin As Double, Zin As Double, pt As POINTAPI)

  Dim X, Y, Z As Double

  Dim xa, xb, ya, yb, za, zb As Double

  Dim h As Double         ' Horizontal projection

  Dim v As Double         ' Vertical projection

  Dim d As Double         ' Depth into screen

  ' "stretch" coordinates. These values correspond to the X, Y, and Z scale factors

   ' on DPlot's Contour Options dialog.

   X = Xin * DPM.stretch(0)

   Y = Yin * DPM.stretch(1)

   Z = Zin * DPM.stretch(2)

   ' 3D to 2D transformation

   ' yaw

   xa = ct(0) * X - st(0) * Z

   ya = Y

   za = st(0) * X + ct(0) * Z

   ' roll

   xb = ct(1) * xa + st(1) * ya

   yb = ct(1) * ya - st(1) * xa

   zb = za

   ' azimuth

   h = -ct(2) * yb - st(2) * zb

   v = xb

   d = ct(2) * zb - st(2) * yb

   ' Now scale h and v to the output:

   pt.X = DPM.hll + DPM.scale * (h - DPM.xlo)

   pt.Y = DPM.vur + DPM.scale * (DPM.yhi - v)

End Sub

Private Sub DoStuff()

  Dim X As Double

  Dim Y As Double

  Dim Z As Double

  Dim pt As POINTAPI

   PI = 4# * Atn(1#)

   '

   ' Get a bitmap using DPlot_GetBitmapEx

   '

   Call AngleTransforms

   '

   ' Get X, Y, Z from text boxes, whatever...

   '

   Call Transform3D(X, Y, Z, pt)

End Sub

 

 

 


Page url: http://www.dplot.com/lib/index.htm?dplot_getbitmapex.htm