From db7a127a32441a31e1401dd2814df1b9a1a911c1 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Tue, 17 Mar 2026 20:51:56 +0200 Subject: failed implementation Since most values are integers, the rounding (any rounding) causes misalignment with true linearity --- AnimationInterpolate.c | 74 ++++++++++++++++++++++++++++++++------------------ AnimationInterpolate.h | 13 ++++----- graphics.c | 18 ------------ 3 files changed, 53 insertions(+), 52 deletions(-) diff --git a/AnimationInterpolate.c b/AnimationInterpolate.c index a84b5a2..d949cc5 100644 --- a/AnimationInterpolate.c +++ b/AnimationInterpolate.c @@ -21,58 +21,78 @@ colorInterpolate(color ina, color inb, double percentage) { ARGB A_Interpolate(const Animation* anim, PixelRendererParams a) { - struct A_Interpolate in = *(struct A_Interpolate*)a.priv; + struct A_Interpolate* in = a.priv; - if (in.interpolate == NULL) { + if (in->interpolate == NULL) { fprintf(stderr, "Interpolation function cannot be NULL!\n"); ARGB_set(&a.pixel, 0xFFFF00FF); return a.pixel; } - if (a.frame.current == a.frame.start) { - memcpy(in.initialValueTemp, in.value, in.initialValueTempSize); - } - double perc = (double)(a.frame.current - a.frame.start) / (a.frame.end - a.frame.start); if (perc < 0.0) perc = 0.0; if (perc > 1.0) perc = 1.0; - in.interpolate(in.value, in.initialValueTemp, in.goalValue, perc); + /* + ? ? + a*(1-p) + b*p = x + ? + a*(1-p1) + b*p1 = c ==> a = (c - b*p1) / (1 - p1) + ? ? + c*(1-p2) + b*p2 = x + + ? ? + a*(1-p) + b*p = c*(1-p2) + b*p2 + ? + (c - b*p1) / (1 - p1) * (1-p) + b*p = c*(1-p2) + b*p2 + (c - b*p1) / (1 - p1) * (1-p) + b*p = c - c*p2 + b*p2 + (c - b*p1) / (1 - p1) * (1-p) + b*p = c + (b - c) * p2 + ((c - b*p1) / (1 - p1) * (1-p) + b*p - c) / (b - c) = p2 + simplified: + (p - p1) / (1 - p1) = p2 + */ + + in->interpolate(in->value, in->goalValue, (perc - in->prevPercentage) / (1.0 - in->prevPercentage)); + if (a.row == 0 && a.col == 0) { + fprintf(stderr, "@ %f : %f -> %f ==> %d \n", perc, perc - in->prevPercentage, (perc - in->prevPercentage) / (1.0 - in->prevPercentage), ((struct AM_Linear*)in->value)->startCol); + } + + in->prevPercentage = perc; return a.pixel; } void -AO_LineInterpolate(void* valueLine, const void* initialLine, const void* finalLine, double percentage) { +AO_LineInterpolate(void* valueLine, const void* finalLine, double percentage) { struct AO_Line* value = valueLine; - const struct AO_Line* initial = initialLine, *final = finalLine; + const struct AO_Line* final = finalLine; - value->a = NUM_INTERPOLATE(initial->a, final->a, percentage); - value->b = NUM_INTERPOLATE(initial->b, final->b, percentage); - value->c = NUM_INTERPOLATE(initial->c, final->c, percentage); - value->width = NUM_INTERPOLATE(initial->width, final->width, percentage); - value->color = colorInterpolate(initial->color, final->color, percentage); + value->a = NUM_INTERPOLATE(value->a, final->a, percentage); + value->b = NUM_INTERPOLATE(value->b, final->b, percentage); + value->c = NUM_INTERPOLATE(value->c, final->c, percentage); + value->width = NUM_INTERPOLATE(value->width, final->width, percentage); + value->color = colorInterpolate(value->color, final->color, percentage); } void -AM_LinearInterpolate(void* valueIn, const void* initialIn, const void* finalIn, double percentage) { +AM_LinearInterpolate(void* valueIn, const void* finalIn, double percentage) { struct AM_Linear* value = valueIn; - const struct AM_Linear* initial = initialIn, *final = finalIn; + const struct AM_Linear* final = finalIn; - value->startRow = NUM_INTERPOLATE(initial->startRow, final->startRow, percentage); - value->startCol = NUM_INTERPOLATE(initial->startCol, final->startCol, percentage); - value->dRow = NUM_INTERPOLATE(initial->dRow, final->dRow, percentage); - value->dCol = NUM_INTERPOLATE(initial->dCol, final->dCol, percentage); - value->wrapCoordinates = NUM_INTERPOLATE(initial->wrapCoordinates, final->wrapCoordinates, percentage); + value->startRow = NUM_INTERPOLATE(value->startRow, final->startRow, percentage); + value->startCol = NUM_INTERPOLATE(value->startCol, final->startCol, percentage); + value->dRow = NUM_INTERPOLATE(value->dRow, final->dRow, percentage); + value->dCol = NUM_INTERPOLATE(value->dCol, final->dCol, percentage); + value->wrapCoordinates = NUM_INTERPOLATE(value->wrapCoordinates, final->wrapCoordinates, percentage); } void -AM_SpinInterpolate(void* valueIn, const void* initialIn, const void* finalIn, double percentage) { +AM_SpinInterpolate(void* valueIn, const void* finalIn, double percentage) { struct AM_Spin* value = valueIn; - const struct AM_Spin* initial = initialIn, *final = finalIn; + const struct AM_Spin* final = finalIn; - value->theta = NUM_INTERPOLATE(initial->theta, final->theta, percentage); - value->dTheta = NUM_INTERPOLATE(initial->dTheta, final->dTheta, percentage); - value->centerRow = NUM_INTERPOLATE(initial->centerRow, final->centerRow, percentage); - value->centerCol = NUM_INTERPOLATE(initial->centerCol, final->centerCol, percentage); + value->theta = NUM_INTERPOLATE(value->theta, final->theta, percentage); + value->dTheta = NUM_INTERPOLATE(value->dTheta, final->dTheta, percentage); + value->centerRow = NUM_INTERPOLATE(value->centerRow, final->centerRow, percentage); + value->centerCol = NUM_INTERPOLATE(value->centerCol, final->centerCol, percentage); } diff --git a/AnimationInterpolate.h b/AnimationInterpolate.h index 18ae841..eaa0b3c 100644 --- a/AnimationInterpolate.h +++ b/AnimationInterpolate.h @@ -4,19 +4,18 @@ #include "Animation.h" struct A_Interpolate { - void* initialValueTemp; - size_t initialValueTempSize; - void* value; void* goalValue; - void (*interpolate)(void* value, const void* initialState, const void* finalState, double percentage); + void (*interpolate)(void* value, const void* finalState, double percentage); + + double prevPercentage; }; ARGB A_Interpolate(const Animation* anim, PixelRendererParams params); -void AO_LineInterpolate(void* valueLine, const void* initialLine, const void* finalLine, double percentage); +void AO_LineInterpolate(void* valueLine, const void* finalLine, double percentage); -void AM_LinearInterpolate(void* valueLinear, const void* initialLinear, const void* finalLinear, double percentage); -void AM_SpinInterpolate(void* valueSpin, const void* initialSpin, const void* finalSpin, double percentage); +void AM_LinearInterpolate(void* valueLinear, const void* finalLinear, double percentage); +void AM_SpinInterpolate(void* valueSpin, const void* finalSpin, double percentage); #endif /* _ANIMATION_INTERPOLATE */ diff --git a/graphics.c b/graphics.c index 4ac5055..10d374b 100644 --- a/graphics.c +++ b/graphics.c @@ -104,46 +104,28 @@ main() { /* Movement */ - struct AM_Linear temp1; struct A_Interpolate childNode_moveToLeft = { - .initialValueTemp = &temp1, .initialValueTempSize = sizeof(temp1), - .interpolate = AM_LinearInterpolate, .value = &childNode, .goalValue = &childNode_left, }; - struct AM_Spin temp11; struct A_Interpolate segment_spin_moveToLeft = { - .initialValueTemp = &temp11, .initialValueTempSize = sizeof(temp11), - .interpolate = AM_SpinInterpolate, .value = &link_spin, .goalValue = &link_spin_left, }; - struct AM_Linear temp12; struct A_Interpolate segment_translate_moveToLeft = { - .initialValueTemp = &temp12, .initialValueTempSize = sizeof(temp12), - .interpolate = AM_LinearInterpolate, .value = &link_translate, .goalValue = &link_translate_left, }; - struct AM_Linear temp2; struct A_Interpolate childNode_moveToRight = { - .initialValueTemp = &temp2, .initialValueTempSize = sizeof(temp2), - .interpolate = AM_LinearInterpolate, .value = &childNode, .goalValue = &childNode_right, }; - struct AM_Spin temp21; struct A_Interpolate segment_spin_moveToRight = { - .initialValueTemp = &temp21, .initialValueTempSize = sizeof(temp21), - .interpolate = AM_SpinInterpolate, .value = &link_spin, .goalValue = &link_spin_right, }; - struct AM_Linear temp22; struct A_Interpolate segment_translate_moveToRight = { - .initialValueTemp = &temp22, .initialValueTempSize = sizeof(temp22), - .interpolate = AM_LinearInterpolate, .value = &link_translate, .goalValue = &link_translate_right, }; -- cgit v1.2.3