From 4fe01b47d6f77366e10bba7dbee433915ae49d3d Mon Sep 17 00:00:00 2001 From: qwx Date: Tue, 21 Jan 2025 21:20:25 +0000 Subject: [PATCH] draw, layout: improve defaults, nicer plots, better positioning fixes test/03.232.gfa as well. --- draw/color.c | 2 +- draw/draw.c | 15 ++++++++------- draw/drw.h | 8 ++++---- layout/pfr.c | 26 ++++++++++++++------------ ui/ui.c | 2 +- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/draw/color.c b/draw/color.c index 7af1187..114ae7d 100644 --- a/draw/color.c +++ b/draw/color.c @@ -19,7 +19,7 @@ static u32int theme1[Cend] = { static u32int theme2[Cend] = { [Cbg] = 0xffffffff, [Ctext] = 0xeeee00ff, - [Cedge] = 0x77777730, + [Cedge] = 0x44444477, [Cemph] = 0xff0000ff, [Chigh] = 0x000000ff, }; diff --git a/draw/draw.c b/draw/draw.c index c0708f1..5a80aa1 100644 --- a/draw/draw.c +++ b/draw/draw.c @@ -71,18 +71,19 @@ resizenodes(void) if((drawing.flags & DFstalelen) == 0) return; drawing.flags &= ~DFstalelen; - if(drawing.length.min <= 0) - drawing.length.min = 1; + if(drawing.length.min <= Minsz) + drawing.length.min = Minsz; if(drawing.length.max <= drawing.length.min) - drawing.length.max = drawing.length.min + Nodesz; - Δ = MAX(1.0, drawing.length.max - drawing.length.min); - max = Nodesz * log(0.05 + Δ); + drawing.length.max = Minsz; + Δ = MAX(Minsz, drawing.length.max - drawing.length.min); + max = Maxsz; for(r=rnodes, re=r+dylen(r); rlen; if(l == 0.0) - l = 1.0; - r->len = (max - (max - 0.05) * exp(-l / Δ)); + l = Minsz; + r->len = (max - (max - Minsz) * exp(-l / Δ)); } + drawing.length.max = (max - (max - Minsz) * exp(-drawing.length.max / Δ)); } static inline void diff --git a/draw/drw.h b/draw/drw.h index cb81ed7..061ccc5 100644 --- a/draw/drw.h +++ b/draw/drw.h @@ -11,10 +11,10 @@ typedef struct Range Range; #pragma incomplete Color -#define Nodesz 5.0f -#define Ptsz 2.0f -#define Maxsz 40.0f -#define Minsz 0.1f +#define Nodesz 2.0f +#define Ptsz 1.5f +#define Minsz 0.2f +#define Maxsz (100.0f * Minsz) struct Range{ float min; diff --git a/layout/pfr.c b/layout/pfr.c index e27751e..635a819 100644 --- a/layout/pfr.c +++ b/layout/pfr.c @@ -9,8 +9,8 @@ enum{ Area = W * H, }; -#define C ((float)Nodesz / (Maxsz - Minsz) * 0.7f) -#define Tolerance 0.001f +#define C (Ptsz * Ptsz * Minsz / Maxsz) +#define Tolerance 0.005f typedef struct Aux Aux; struct Aux{ @@ -130,7 +130,7 @@ compute3d(void *arg, volatile int *stat, int i) { int fixed, skip; ioff *e, *ee; - float t, tol, k, f, x, y, z, Δx, Δy, Δz, δx, δy, δz, δ, w, uw, vw, Δr; + float t, tol, k, f, x, y, z, Δx, Δy, Δz, δx, δy, δz, δ, w, uw, vw, mw, Δr; RNode *r0, *r1, *r, *v; Aux *aux; Node *u, *u0; @@ -144,6 +144,7 @@ compute3d(void *arg, volatile int *stat, int i) r0 = rnodes + i; r1 = rnodes + dylen(nodes); skip = nlaythreads; + mw = 2.0f * drawing.length.max; for(;;){ CLK0(clk); Δr = 0; @@ -155,7 +156,7 @@ compute3d(void *arg, volatile int *stat, int i) fixed = u->flags & FNfixed; if(fixed == FNfixed) continue; - uw = r->len; + uw = mw - r->len; x = r->pos[0]; y = r->pos[1]; z = r->pos[2]; @@ -168,8 +169,8 @@ compute3d(void *arg, volatile int *stat, int i) δz = z - v->pos[2]; δ = Δ3(δx, δy, δz); f = Fr(δ, k); - vw = v->len; - w = C * MIN(uw, vw); + vw = mw - v->len; + w = C * MAX(uw, vw); Δx += w * f * δx / δ; Δy += w * f * δy / δ; Δz += w * f * δz / δ; @@ -183,7 +184,7 @@ compute3d(void *arg, volatile int *stat, int i) δz = v->pos[2] - z; δ = Δ3(δx, δy, δz); f = Fa(δ, k); - vw = v->len; + vw = mw - v->len; if(uw < vw) w = uw / vw; else @@ -236,7 +237,7 @@ compute(void *arg, volatile int *stat, int i) { int fixed, skip; ioff *e, *ee; - float t, tol, k, f, x, y, Δx, Δy, δx, δy, δ, w, uw, vw, Δr; + float t, tol, k, f, x, y, Δx, Δy, δx, δy, δ, w, uw, vw, mw, Δr; RNode *r0, *r1, *r, *v; Aux *aux; Node *u, *u0; @@ -250,6 +251,7 @@ compute(void *arg, volatile int *stat, int i) r0 = rnodes + i; r1 = rnodes + dylen(rnodes); skip = nlaythreads; + mw = 2.0f * drawing.length.max; for(;;){ CLK0(clk); Δr = 0; @@ -261,7 +263,7 @@ compute(void *arg, volatile int *stat, int i) fixed = u->flags & FNfixed; if(fixed == FNfixed) continue; - uw = r->len; + uw = mw - r->len; x = r->pos[0]; y = r->pos[1]; Δx = Δy = 0.0f; @@ -272,8 +274,8 @@ compute(void *arg, volatile int *stat, int i) δy = y - v->pos[1]; δ = Δ(δx, δy); f = Fr(δ, k); - vw = v->len; - w = C * MIN(uw, vw); + vw = mw - v->len; + w = C * MAX(uw, vw); Δx += w * f * δx / δ; Δy += w * f * δy / δ; } @@ -285,7 +287,7 @@ compute(void *arg, volatile int *stat, int i) δy = v->pos[1] - y; δ = Δ(δx, δy); f = Fa(δ, k); - vw = v->len; + vw = mw - v->len; if(uw < vw) w = uw / vw; else diff --git a/ui/ui.c b/ui/ui.c index e747105..c0d6051 100644 --- a/ui/ui.c +++ b/ui/ui.c @@ -426,7 +426,7 @@ resetui(void) view.center = ZV; view.θ = 0.0f; view.φ = 0.0f; - view.eye = V(0.0f, 0.0f, 250.0f); + view.eye = V(0.0f, 0.0f, 100.0f); view.up = V(0.0f, 1.0f, 0.0f); view.Δeye = subv(view.eye, view.center); view.pan = ZV;