ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
* Clipping a path to a boundary
@ 2005-08-07 19:16 David Arnold
  2005-08-07 21:56 ` Hans Hagen
  0 siblings, 1 reply; 4+ messages in thread
From: David Arnold @ 2005-08-07 19:16 UTC (permalink / raw)


All,

I'm looking for a new idea for something I need to do. I typically 
create a path on a domain [-5,5] as follows, a arbitrary. Then I 
randomly reflect the path about and axis, a line, or maybe rotate it. 
The result is that parts of the path may lie outside a bounding window.

% define linear function f
vardef f(expr x)=
	a*x*x
enddef;

% define paths for functions f, g, and h, respectively
path P;

P:=(-5,f(-5));
for x=-5 step .1 until 5:
	P:=P--(x,f(x));
endfor;

% initialize scale
numeric u; 10u=w;

% scale and draw graph
P:=P scaled u;
draw P withcolor blue;

% clipping path
path cpath;
cpath:=(-5,-5)--(5,-5)--(5,5)--(-5,5)--cycle;
cpath:=cpath scaled 1u;

% clip and save current picture
picture pic;
clip currentpicture to cpath;
pic:=currentpicture;

% erase currentpicture
currentpicture:=nullpicture;

Then I do some stuff I need to do and bring back the path at a later 
time with:

draw pic;

This works fine. However, what I need to do is somehow clip the path P 
to the bounding box, but retain the resulting cutpath in a path 
variable Q. That is, I need to cut off the parts of the path P that lie 
outside the bounding box cpath:=(-5,-5)--(5,-5)--(5,5)--(-5,5)--cycle 
and store the clipped path in the path variable Q. The difficulty is I 
have no advance knowledge if the path P lies entirely inside the 
bounding box or if it escapes through one of the sides.

Any hints, tips, etc., would be very appreciated.

Thanks.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Clipping a path to a boundary
  2005-08-07 19:16 Clipping a path to a boundary David Arnold
@ 2005-08-07 21:56 ` Hans Hagen
  2005-08-08  0:17   ` David Arnold
  0 siblings, 1 reply; 4+ messages in thread
From: Hans Hagen @ 2005-08-07 21:56 UTC (permalink / raw)


David Arnold wrote:

>
> This works fine. However, what I need to do is somehow clip the path P 
> to the bounding box, but retain the resulting cutpath in a path 
> variable Q. That is, I need to cut off the parts of the path P that 
> lie outside the bounding box 
> cpath:=(-5,-5)--(5,-5)--(5,5)--(-5,5)--cycle and store the clipped 
> path in the path variable Q. The difficulty is I have no advance 
> knowledge if the path P lies entirely inside the bounding box or if it 
> escapes through one of the sides.

it all depends on what you want to do further on; 

- you can do some cutbefore and cutafter trickery, i.e. determine intersectionpoints with the edges of the bbox and do some cutting

- if you just want the path back .. just ask for "pathpart pic" 

Hans 

-----------------------------------------------------------------
                                          Hans Hagen | PRAGMA ADE
              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
     tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com
                                             | www.pragma-pod.nl
-----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Clipping a path to a boundary
  2005-08-07 21:56 ` Hans Hagen
@ 2005-08-08  0:17   ` David Arnold
  2005-08-08 11:30     ` Hans Hagen
  0 siblings, 1 reply; 4+ messages in thread
From: David Arnold @ 2005-08-08  0:17 UTC (permalink / raw)


Hans,

I tried:

% redraw line
path q;
q:=pathpart pic;
drawdblarrow q withcolor blue;

But it drew the clipping path. I wanted the part of the path inside the 
clipping path.

Am I missing something in your directions?

On Aug 7, 2005, at 2:56 PM, Hans Hagen wrote:

> David Arnold wrote:
>
>>
>> This works fine. However, what I need to do is somehow clip the path 
>> P to the bounding box, but retain the resulting cutpath in a path 
>> variable Q. That is, I need to cut off the parts of the path P that 
>> lie outside the bounding box 
>> cpath:=(-5,-5)--(5,-5)--(5,5)--(-5,5)--cycle and store the clipped 
>> path in the path variable Q. The difficulty is I have no advance 
>> knowledge if the path P lies entirely inside the bounding box or if 
>> it escapes through one of the sides.
>
> it all depends on what you want to do further on;
> - you can do some cutbefore and cutafter trickery, i.e. determine 
> intersectionpoints with the edges of the bbox and do some cutting
>
> - if you just want the path back .. just ask for "pathpart pic"
> Hans
> -----------------------------------------------------------------
>                                          Hans Hagen | PRAGMA ADE
>              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
>     tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com
>                                             | www.pragma-pod.nl
> -----------------------------------------------------------------
>
> _______________________________________________
> ntg-context mailing list
> ntg-context@ntg.nl
> http://www.ntg.nl/mailman/listinfo/ntg-context
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Clipping a path to a boundary
  2005-08-08  0:17   ` David Arnold
@ 2005-08-08 11:30     ` Hans Hagen
  0 siblings, 0 replies; 4+ messages in thread
From: Hans Hagen @ 2005-08-08 11:30 UTC (permalink / raw)


David Arnold wrote:

> Hans,
>
> I tried:
>
> % redraw line
> path q;
> q:=pathpart pic;
> drawdblarrow q withcolor blue;
>
> But it drew the clipping path. I wanted the part of the path inside 
> the clipping path.
>
> Am I missing something in your directions?


ok, here's the full solution ...

\starttext

\setupcolors[state=start]

\startMPpage
    vardef lastpath (expr p) =
        save _p_ ; path _p_ ; _p_ := origin ;
        for i within p :
            if stroked i : _p_ := pathpart i ; fi ;
        endfor ;
        _p_
    enddef ;
    vardef firstpath (expr p) =
        save _p_, _b_ ; path _p_ ; _p_ := origin ; boolean _b_ ; _b_ := 
false ;
        for i within p :
            if not _b_ : if stroked i : _b_ := true ; _p_ := pathpart i 
; fi ; fi ;
        endfor ;
        _p_
    enddef ;
   
    picture pic; pic := image(
        draw fullcircle scaled 5cm withpen pencircle scaled 5mm ;
        draw fullsquare scaled 2cm withpen pencircle scaled 5mm ;
        fill fullcircle scaled 1cm withpen pencircle scaled 5mm ;
    ) ;
   
    draw pic ;
    drawdblarrow lastpath (pic) withcolor blue ;
    drawdblarrow firstpath(pic) withcolor red ;
\stopMPpage

\stoptext

...  suitable for submission to the wiki

> On Aug 7, 2005, at 2:56 PM, Hans Hagen wrote:
>
>> David Arnold wrote:
>>
>>>
>>> This works fine. However, what I need to do is somehow clip the path 
>>> P to the bounding box, but retain the resulting cutpath in a path 
>>> variable Q. That is, I need to cut off the parts of the path P that 
>>> lie outside the bounding box 
>>> cpath:=(-5,-5)--(5,-5)--(5,5)--(-5,5)--cycle and store the clipped 
>>> path in the path variable Q. The difficulty is I have no advance 
>>> knowledge if the path P lies entirely inside the bounding box or if 
>>> it escapes through one of the sides.
>>
>>
>> it all depends on what you want to do further on;
>> - you can do some cutbefore and cutafter trickery, i.e. determine 
>> intersectionpoints with the edges of the bbox and do some cutting
>>
>> - if you just want the path back .. just ask for "pathpart pic"
>> Hans
>> -----------------------------------------------------------------
>>                                          Hans Hagen | PRAGMA ADE
>>              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
>>     tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com
>>                                             | www.pragma-pod.nl
>> -----------------------------------------------------------------
>>
>> _______________________________________________
>> ntg-context mailing list
>> ntg-context@ntg.nl
>> http://www.ntg.nl/mailman/listinfo/ntg-context
>>
>
> _______________________________________________
> ntg-context mailing list
> ntg-context@ntg.nl
> http://www.ntg.nl/mailman/listinfo/ntg-context
>
>
>


-- 

-----------------------------------------------------------------
                                          Hans Hagen | PRAGMA ADE
              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
     tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com
                                             | www.pragma-pod.nl
-----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-08-08 11:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-08-07 19:16 Clipping a path to a boundary David Arnold
2005-08-07 21:56 ` Hans Hagen
2005-08-08  0:17   ` David Arnold
2005-08-08 11:30     ` Hans Hagen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).