// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Offset a polyline corner by width // Not compiled or tested in-world // Setup: Put in a spare owned prim. Set noncollinear XY points PREV/CORNER/NEXT and signed OFFSET. Touch to print the plan privately. // Stop / restore: Remove/disable; calculations do not alter objects. // Notes: Positive offset is left of travel. Nearly parallel offset lines are rejected; sharp corners may require beveling. // License: see LICENSE in this distribution. // Original Incoprea. MIT. Calculation only. vector PREV=<0.0,0.0,0.0>; vector CORNER=<5.0,0.0,0.0>; vector NEXT=<7.0,4.0,0.0>; float OFFSET=0.5; float cross2(vector a,vector b) { return a.x*b.y-a.y*b.x; } default { touch_start(integer detectedCount) { if(llDetectedKey(0)!=llGetOwner())return; vector d1=CORNER-PREV; vector d2=NEXT-CORNER; d1.z=0.0; d2.z=0.0; if(llVecMag(d1)<0.000001||llVecMag(d2)<0.000001) { llOwnerSay("Repeated vertex."); return; } d1=llVecNorm(d1); d2=llVecNorm(d2); vector p=CORNER+OFFSET*<-d1.y,d1.x,0.0>; vector q=CORNER+OFFSET*<-d2.y,d2.x,0.0>; float den=cross2(d1,d2); if(llFabs(den)<0.000001) { llOwnerSay("Parallel corner; handle straight path separately."); return; } llOwnerSay("Offset corner="+(string)(p+d1*(cross2(q-p,d2)/den))); } }