Skip to content

Commit 07e1b27

Browse files
committed
b
1 parent 51b4577 commit 07e1b27

File tree

2 files changed

+98
-66
lines changed

2 files changed

+98
-66
lines changed

Nodes/NodesModel.hpp

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -142,52 +142,76 @@ class Nodes
142142
distances.push_back(dist);
143143
}
144144

145-
// Calculate weights based on distances with blur
145+
// Find the two closest nodes for smooth transition
146+
float minDist = std::numeric_limits<float>::max();
147+
float secondMinDist = std::numeric_limits<float>::max();
148+
int closestNode = -1;
149+
int secondClosestNode = -1;
150+
151+
for (int i = 0; i < m_nodes.size(); ++i)
152+
{
153+
if (distances[i] < minDist)
154+
{
155+
secondMinDist = minDist;
156+
secondClosestNode = closestNode;
157+
minDist = distances[i];
158+
closestNode = i;
159+
}
160+
else if (distances[i] < secondMinDist)
161+
{
162+
secondMinDist = distances[i];
163+
secondClosestNode = i;
164+
}
165+
}
166+
167+
// Calculate weights with blur
146168
const float blurRadius = inputs.globalRadius;
147169

148170
for (int i = 0; i < m_nodes.size(); ++i)
149171
{
150172
float weight = 0.0f;
151173

152-
// Check if this node could have non-zero weight
153-
bool isClosest = true;
154-
for (int j = 0; j < m_nodes.size(); ++j)
174+
if (i == closestNode)
155175
{
156-
if (i != j && distances[j] < distances[i] - blurRadius)
176+
// Weight for closest node
177+
if (secondClosestNode >= 0)
157178
{
158-
isClosest = false;
159-
break;
179+
float distDiff = secondMinDist - minDist;
180+
if (distDiff < 2.0f * blurRadius)
181+
{
182+
// We're in the transition zone
183+
// When distDiff = 0, both weights should be 0.5
184+
// When distDiff = 2*blurRadius, closest gets full weight
185+
weight = 0.5f + (distDiff / (4.0f * blurRadius));
186+
weight = std::min(1.0f, weight);
187+
}
188+
else
189+
{
190+
weight = 1.0f;
191+
}
192+
}
193+
else
194+
{
195+
weight = 1.0f;
160196
}
161197
}
162-
163-
if (isClosest)
198+
else if (i == secondClosestNode && closestNode >= 0)
164199
{
165-
// Calculate smooth weight based on distance differences
166-
weight = 1.0f;
167-
for (int j = 0; j < m_nodes.size(); ++j)
200+
// Weight for second closest node
201+
float distDiff = distances[i] - minDist;
202+
if (distDiff < 2.0f * blurRadius)
168203
{
169-
if (i != j)
170-
{
171-
float diff = distances[i] - distances[j];
172-
if (diff > -blurRadius && diff < blurRadius)
173-
{
174-
// Smooth transition within blur radius
175-
float t = (diff + blurRadius) / (2.0f * blurRadius);
176-
weight *= t;
177-
}
178-
else if (diff >= blurRadius)
179-
{
180-
weight = 0.0f;
181-
break;
182-
}
183-
}
204+
// We're in the transition zone
205+
weight = 0.5f - (distDiff / (4.0f * blurRadius));
206+
weight = std::max(0.0f, weight);
184207
}
185208
}
209+
// All other nodes get 0 weight
186210

187211
weights.push_back(weight);
188212
}
189213

190-
// Normalize weights
214+
// Normalize weights to ensure they sum to 1
191215
float totalWeight = 0.0f;
192216
for (auto w : weights)
193217
{

Nodes/NodesWidget.hpp

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -298,57 +298,65 @@ struct NodesWidget
298298
distances.push_back(dist);
299299
}
300300

301-
// Calculate weights for blended Voronoi
302-
std::vector<float> weights(nodes.size(), 0.0f);
301+
// Find the two closest nodes
302+
float minDist = std::numeric_limits<float>::max();
303+
float secondMinDist = std::numeric_limits<float>::max();
304+
int closestNode = -1;
305+
int secondClosestNode = -1;
303306

304307
for (int i = 0; i < nodes.size(); ++i)
305308
{
306-
float weight = 1.0f;
307-
308-
for (int j = 0; j < nodes.size(); ++j)
309+
if (distances[i] < minDist)
309310
{
310-
if (i != j)
311-
{
312-
float diff = distances[i] - distances[j];
313-
if (diff > -blurRadius && diff < blurRadius)
314-
{
315-
// Smooth transition within blur radius
316-
float t = (diff + blurRadius) / (2.0f * blurRadius);
317-
weight *= t;
318-
}
319-
else if (diff >= blurRadius)
320-
{
321-
weight = 0.0f;
322-
break;
323-
}
324-
}
311+
secondMinDist = minDist;
312+
secondClosestNode = closestNode;
313+
minDist = distances[i];
314+
closestNode = i;
315+
}
316+
else if (distances[i] < secondMinDist)
317+
{
318+
secondMinDist = distances[i];
319+
secondClosestNode = i;
325320
}
326-
327-
weights[i] = weight;
328-
}
329-
330-
// Normalize weights
331-
float totalWeight = 0.0f;
332-
for (auto w : weights)
333-
{
334-
totalWeight += w;
335321
}
336322

337-
if (totalWeight > 0.0f)
323+
if (closestNode >= 0)
338324
{
339-
// Blend colors based on weights
340-
float r = 0, g = 0, b = 0;
325+
// Calculate colors based on weights
326+
float r, g, b;
341327

342-
for (int i = 0; i < nodes.size(); ++i)
328+
if (secondClosestNode >= 0)
343329
{
344-
if (weights[i] > 0.0f)
330+
float distDiff = secondMinDist - minDist;
331+
if (distDiff < 2.0f * blurRadius)
332+
{
333+
// We're in the transition zone - blend colors
334+
float weight1 = 0.5f + (distDiff / (4.0f * blurRadius));
335+
weight1 = std::min(1.0f, weight1);
336+
float weight2 = 1.0f - weight1;
337+
338+
r = weight1 * ((closestNode * 67) % 128 + 40) +
339+
weight2 * ((secondClosestNode * 67) % 128 + 40);
340+
g = weight1 * ((closestNode * 149) % 128 + 40) +
341+
weight2 * ((secondClosestNode * 149) % 128 + 40);
342+
b = weight1 * ((closestNode * 211) % 128 + 40) +
343+
weight2 * ((secondClosestNode * 211) % 128 + 40);
344+
}
345+
else
345346
{
346-
float w = weights[i] / totalWeight;
347-
r += w * ((i * 67) % 128 + 40);
348-
g += w * ((i * 149) % 128 + 40);
349-
b += w * ((i * 211) % 128 + 40);
347+
// Pure closest node color
348+
r = (closestNode * 67) % 128 + 40;
349+
g = (closestNode * 149) % 128 + 40;
350+
b = (closestNode * 211) % 128 + 40;
350351
}
351352
}
353+
else
354+
{
355+
// Only one node - use its color
356+
r = (closestNode * 67) % 128 + 40;
357+
g = (closestNode * 149) % 128 + 40;
358+
b = (closestNode * 211) % 128 + 40;
359+
}
352360

353361
ctx.set_fill_color({(uint8_t)r, (uint8_t)g, (uint8_t)b, 60});
354362
ctx.begin_path();

0 commit comments

Comments
 (0)