Re: Qahirah: A High-Level Cairo API Binding For Python 3

Olaf Schmidt <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
Am 09.03.2015 um 03:27 schrieb Lawrence D'Oliveiro:
> On Mon, 09 Mar 2015 03:04:13 +0100, Olaf Schmidt wrote:
>
>> The code-size is about two/thirds of your python-script here:
>> https://github.com/ldo/qahirah_examples/blob/master/alhambra_tiles
>
> Interesting that you use hard-coded numbers for the shape of the
> curves. Mine does not. You can change the tilt and curve_factor
> parameters on my triwing, or the wing_ratio on my arrowing, to produce a
> whole family of curves with exactly the same symmetry properties.
>
> That was the key point I was trying to demonstrate: the ability to do
> powerful geometrical calculations in just a few lines of code.
>

Well, hardwired Values in Pattern-Creation-Routines are not all
that uncommon. And they allow some flexibility as well (if needed).

Adding a few more Optional Params to the freestanding Wing-Routine
I've posted earlier, allows for quite some variety as e.g.:

*using defaults*
RenderTriWingPattern "c:\temp\Example1.png"
http://vbRichClient.com/Downloads/Example1.png

*Zoom 1.5, Tilt 30°, default-CurveFactor*
RenderTriWingPattern "c:\temp\Example2.png", 1.5, 30
http://vbRichClient.com/Downloads/Example2.png

*Zoom 1.25, Tilt 45°, CurveFactor = 0.8*
RenderTriWingPattern "c:\temp\Example3.png", 1.25, 45, 0.8
http://vbRichClient.com/Downloads/Example3.png

*Zoom 0.75, Tilt 60°, CurveFactor = 1.6*
RenderTriWingPattern "c:\temp\Example4.png", 0.75, 60, 1.6
http://vbRichClient.com/Downloads/Example4.png

*Zoom 1.75, Tilt 75°, CurveFactor = 2.6*
RenderTriWingPattern "c:\temp\Example5.png", 1.75, 75, 2.6
http://vbRichClient.com/Downloads/Example5.png

Here's the slightly enhanced routine (and BTW Tilting is
quite easy, using the normal Cairo-Pattern-Matrix, after
the thing comes back from the PopGroup-call).

Sub RenderTriWingPattern(FileName$, Optional Zoom = 1, _
                                     Optional TiltDeg = 0, _
                                     Optional CurveFac = 1)
Dim R As Double, A As Double, P(0 To 17), i, j, n, Pat As cCairoPattern

   With Cairo.CreateSurface(400, 400).CreateContext

     .PushGroup , 0, 0, 48 * Zoom, 84 * Zoom
     .ScaleDrawings Zoom, Zoom

     For j = 1 To 3
       For i = 1 To 3
         A = 270 * Cairo.PI / 180
         For n = 0 To 8
           R = Choose(n Mod 3 + 1, -7 * CurveFac ^ 2, 33 * CurveFac, 28)
           A = A + Choose(n Mod 3 + 1, 5, 40, 75) * Cairo.PI / 180
           P(2 * n) = R * Cos(A): P(2 * n + 1) = R * Sin(A)
         Next n
         .MoveTo P(16), P(17)
         For n = 0 To UBound(P) Step 6
           .CurveTo P(n), P(n+1), P(n+2), P(n+3), P(n+4), P(n+5)
         Next n
         .Fill , Cairo.CreateSolidPatternLng(vbBlack)
         .TranslateDrawings 48, 0
       Next i
       .TranslateDrawings -48 * (i - 0.5), 42
     Next j

     Set Pat = .PopGroup(True, CAIRO_EXTEND_REPEAT)
     Set Pat.Matrix = Pat.Matrix.RotateCoordsDeg(TiltDeg)

     .Paint , Cairo.CreateSolidPatternLng(vbWhite)
     .Paint , Pat
     .Surface.WriteContentToPngFile FileName
   End With
End Sub

So, that's still quite short for a freestanding routine - and
still easy to port to the normal C-flat-API.
<shrug>

Olaf

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.