Overview
Comment: | Improved boundry box estimation for arcs. Response to forum post ed93cba38d. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
9b9b3133644ff804f8312bb839ad4eb4 |
User & Date: | drh 2025-03-19 12:41:21.100 |
Context
2025-03-19
| ||
16:19 | A more precise computation of the bounding box for an arc. (check-in: 8a43b02014 user: drh tags: trunk) | |
12:41 | Improved boundry box estimation for arcs. Response to forum post ed93cba38d. (check-in: 9b9b313364 user: drh tags: trunk) | |
2025-03-13
| ||
11:15 | Updates to the download page to reflect the fact that "pikchr.c" is no longer stored in the source tree. (check-in: 6d099ccfa5 user: drh tags: trunk) | |
Changes
Changes to pikchr.y.
︙ | ︙ | |||
1017 1018 1019 1020 1021 1022 1023 | } /* Hack: Arcs are here rendered as quadratic Bezier curves rather ** than true arcs. Multiple reasons: (1) the legacy-PIC parameters ** that control arcs are obscure and I could not figure out what they ** mean based on available documentation. (2) Arcs are rarely used, ** and so do not seem that important. */ | | | | | > > | | 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 | } /* Hack: Arcs are here rendered as quadratic Bezier curves rather ** than true arcs. Multiple reasons: (1) the legacy-PIC parameters ** that control arcs are obscure and I could not figure out what they ** mean based on available documentation. (2) Arcs are rarely used, ** and so do not seem that important. */ static PPoint arcControlPoint(int cw, PPoint f, PPoint t, PNum rScale, PNum rPct){ PPoint m; PNum dx, dy; m.x = rPct*(f.x+t.x); m.y = rPct*(f.y+t.y); dx = t.x - f.x; dy = t.y - f.y; if( cw ){ m.x -= 0.5*rScale*dy; m.y += 0.5*rScale*dx; }else{ m.x += 0.5*rScale*dy; m.y -= 0.5*rScale*dx; } return m; } static void arcCheck(Pik *p, PObj *pObj){ PPoint m; if( p->nTPath>2 ){ pik_error(p, &pObj->errTok, "arc geometry error"); return; } m = arcControlPoint(pObj->cw, p->aTPath[0], p->aTPath[1], 0.5, 0.25); pik_bbox_add_xy(&pObj->bbox, m.x, m.y); m = arcControlPoint(pObj->cw, p->aTPath[0], p->aTPath[1], 0.5, 0.75); pik_bbox_add_xy(&pObj->bbox, m.x, m.y); } static void arcRender(Pik *p, PObj *pObj){ PPoint f, m, t; if( pObj->nPath<2 ) return; if( pObj->sw<0.0 ) return; f = pObj->aPath[0]; t = pObj->aPath[1]; m = arcControlPoint(pObj->cw,f,t,1.0,0.5); if( pObj->larrow ){ pik_draw_arrowhead(p,&m,&f,pObj); } if( pObj->rarrow ){ pik_draw_arrowhead(p,&m,&t,pObj); } pik_append_xy(p,"<path d=\"M", f.x, f.y); |
︙ | ︙ |