Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.postscript > #1564

Re: I like some feedback on my tetrafoil function

From Cecil Westerhof <Cecil@decebal.nl>
Newsgroups comp.lang.postscript
Subject Re: I like some feedback on my tetrafoil function
Organization Decebal Computing
References <87haf98sc1.fsf@Aspire.decebal.nl> <67f824cb-26ed-4370-b521-4848c329ab0a@googlegroups.com>
Date 2013-08-02 11:06 +0200
Message-ID <87y58k7986.fsf@Aspire.decebal.nl> (permalink)

Show all headers | View raw


Op vrijdag 2 aug 2013 05:40 CEST schreef luser:

>> I have a few questions about this.
>>
>> Is the manner I work with optional parameters the way to do it, or
>> are there better ways? (I think it the most likely I want to draw
>> the inner cross, and the least likely I want to draw the outer
>> box.)
>>
>
> I think the way you're doing it is as good as any, from the
> technical side. But from the programming side, you're encoding lots
> of power into the function, but you're not really abstracting away
> any of the details.
>
> I would tend to make a fully-general function, with all parameters
> required. And then make a few convenience functions that accept
> just a few necessary parameters. Optional parameters are just weird;
> no matter how you do it. (IMHO)

For the convenience functions I kept outerbox optional. But one
optional parameter is not to bad I think. I also made a filled
version:
    % centerX centerY width outerBox innerCircle innerCross  drawTetrafoil  -
    /drawTetrafoil {
        gsave
            newpath
            drawTetrafoilRaw
            stroke
        grestore
    } def
    
    % centerX centerY width [outerBox]  drawTetrafoilAll  -
    /drawTetrafoilAll {
        dup type /booleantype ne {
            false
        } if
        true true
        drawTetrafoil
    } def
    
    % centerX centerY width [outerBox]  drawTetrafoilCrossed  -
    /drawTetrafoilCrossed {
        dup type /booleantype ne {
            false
        } if
        false true
        drawTetrafoil
    } def
    
    % centerX centerY width [outerBox]  drawTetrafoilEmpty  -
    /drawTetrafoilEmpty {
        dup type /booleantype ne {
            false
        } if
        false false
        drawTetrafoil
    } def
    
    % centerX centerY width [outerBox]  drawTetrafoilFilled  -
    /drawTetrafoilFilled {
        dup type /booleantype ne {
            false
        } if
        false false
        gsave
            newpath
            drawTetrafoilRaw
            fill
        grestore
    } def
    
    % centerX centerY width [outerBox]  drawTetrafoilInnerCircle  -
    /drawTetrafoilInnerCircle {
        dup type /booleantype ne {
            false
        } if
        true false
        drawTetrafoil
    } def
    
    % centerX centerY width outerBox innerCircle innerCross  drawTetrafoilRaw  -
    /drawTetrafoilRaw {
        10 dict begin
            /innerCross exch def
            /innerCircle exch def
            /outerBox exch def
            /width    exch def
            /centerY  exch def
            /centerX  exch def
    
            /circleRadius width 4 div def
    
            centerX  centerY  translate
            outerBox {
                width -.5 mul dup
                width dup
                rectstroke
            } if
            innerCircle {
                0  0  circleRadius  0  360  arc
                stroke
            } if
            2 setlinejoin
            4 {
                innerCross {
                    0  0  moveto
                    0  circleRadius  rlineto
                } if
                circleRadius neg  circleRadius  circleRadius  0  270  arc
                90 rotate
            } repeat
            closepath
        end
    } def


>> Something is wrong in my function. If I call it with:
>>
>> 235 100 100 true true false drawTetrafoil
>>
>>
>>
>> The inner circle is correct at North, but in West, South and East
>> the
>>
>> inner ‘arms’ of the tetrafoil go through the inner circle. What is
>>
>> going wrong?
>>
>
> It's the mitered line join. Either use `setlinejoin` or
> `setmiterlimit`
>
> Adding
>
> 2 setlinejoin
>
> before the call, fixes the output.

Done.


>> I want to rotate the tetrafoil, but in such a way that it stays in
>> the
>>
>> outer box. What is the best way to get this done?
>>
>
> You can use `pathbbox` for this. It returns bounding-box coordinates
> for the current path in the current user space. Make sure to
> `flattenpath` first, to tighten-up against the curves (otherwise, it
> uses the outer control points from the curve segments, which you
> don't want here).

Maybe I understand you wrong, But I already know the bounding box (I
draw him). What I mean is the following: Now the first ‘leaf’ is in
the North-East corner. I want him for example also be at North. That
would be simple I think. I need to divide circleRadius by ‘2 sqrt’.
But what about the interleaving rotations?

-- 
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof

Back to comp.lang.postscript | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

I like some feedback on my tetrafoil function Cecil Westerhof <Cecil@decebal.nl> - 2013-08-01 15:15 +0200
  Re: I like some feedback on my tetrafoil function luser- -droog <mijoryx@yahoo.com> - 2013-08-01 20:40 -0700
    Re: I like some feedback on my tetrafoil function Cecil Westerhof <Cecil@decebal.nl> - 2013-08-02 11:06 +0200
      Re: I like some feedback on my tetrafoil function luser- -droog <mijoryx@yahoo.com> - 2013-10-29 02:30 -0700

csiph-web