iPDC-suite/iPDC/lib/liblivechart.so.p/bezier.c

535 lines
14 KiB
C

/* bezier.c generated by valac 0.56.0, the Vala compiler
* generated from bezier.vala, do not modify */
#include <glib.h>
#include <float.h>
#include <math.h>
#include "livechart.h"
#include <gee.h>
#include <glib-object.h>
#include <string.h>
#define LIVE_CHART_POLYNOMIAL_TOLERANCE 1e-6
#define _g_free0(var) ((var == NULL) ? NULL : (var = (g_free (var), NULL)))
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
VALA_EXTERN GeeList* live_chart_get_cubic_roots (gdouble C3,
gdouble C2,
gdouble C1,
gdouble C0);
static gdouble* _double_dup (gdouble* self);
GeeList*
live_chart_find_intersections_between (LiveChartSegment* segment,
LiveChartBezierCurve* bezier)
{
gdouble ax = 0.0;
LiveChartBezierCurve _tmp0_;
LiveChartCoord _tmp1_;
LiveChartBezierCurve _tmp2_;
LiveChartCoord _tmp3_;
LiveChartBezierCurve _tmp4_;
LiveChartCoord _tmp5_;
LiveChartBezierCurve _tmp6_;
LiveChartCoord _tmp7_;
gdouble ay = 0.0;
LiveChartBezierCurve _tmp8_;
LiveChartCoord _tmp9_;
LiveChartBezierCurve _tmp10_;
LiveChartCoord _tmp11_;
LiveChartBezierCurve _tmp12_;
LiveChartCoord _tmp13_;
LiveChartBezierCurve _tmp14_;
LiveChartCoord _tmp15_;
gdouble bx = 0.0;
LiveChartBezierCurve _tmp16_;
LiveChartCoord _tmp17_;
LiveChartBezierCurve _tmp18_;
LiveChartCoord _tmp19_;
LiveChartBezierCurve _tmp20_;
LiveChartCoord _tmp21_;
gdouble by = 0.0;
LiveChartBezierCurve _tmp22_;
LiveChartCoord _tmp23_;
LiveChartBezierCurve _tmp24_;
LiveChartCoord _tmp25_;
LiveChartBezierCurve _tmp26_;
LiveChartCoord _tmp27_;
gdouble cx = 0.0;
LiveChartBezierCurve _tmp28_;
LiveChartCoord _tmp29_;
LiveChartBezierCurve _tmp30_;
LiveChartCoord _tmp31_;
gdouble cy = 0.0;
LiveChartBezierCurve _tmp32_;
LiveChartCoord _tmp33_;
LiveChartBezierCurve _tmp34_;
LiveChartCoord _tmp35_;
gdouble dx = 0.0;
LiveChartBezierCurve _tmp36_;
LiveChartCoord _tmp37_;
gdouble dy = 0.0;
LiveChartBezierCurve _tmp38_;
LiveChartCoord _tmp39_;
gdouble vx = 0.0;
LiveChartSegment _tmp40_;
LiveChartCoord _tmp41_;
LiveChartSegment _tmp42_;
LiveChartCoord _tmp43_;
gdouble vy = 0.0;
LiveChartSegment _tmp44_;
LiveChartCoord _tmp45_;
LiveChartSegment _tmp46_;
LiveChartCoord _tmp47_;
gdouble d = 0.0;
LiveChartSegment _tmp48_;
LiveChartCoord _tmp49_;
LiveChartSegment _tmp50_;
LiveChartCoord _tmp51_;
GeeList* roots = NULL;
GeeList* _tmp52_;
GeeArrayList* results = NULL;
GeeArrayList* _tmp53_;
GeeList* result;
#line 6 "../src/bezier.vala"
g_return_val_if_fail (segment != NULL, NULL);
#line 6 "../src/bezier.vala"
g_return_val_if_fail (bezier != NULL, NULL);
#line 8 "../src/bezier.vala"
_tmp0_ = *bezier;
#line 8 "../src/bezier.vala"
_tmp1_ = _tmp0_.c1;
#line 8 "../src/bezier.vala"
_tmp2_ = *bezier;
#line 8 "../src/bezier.vala"
_tmp3_ = _tmp2_.c2;
#line 8 "../src/bezier.vala"
_tmp4_ = *bezier;
#line 8 "../src/bezier.vala"
_tmp5_ = _tmp4_.c3;
#line 8 "../src/bezier.vala"
_tmp6_ = *bezier;
#line 8 "../src/bezier.vala"
_tmp7_ = _tmp6_.c0;
#line 8 "../src/bezier.vala"
ax = ((3 * (_tmp1_.x - _tmp3_.x)) + _tmp5_.x) - _tmp7_.x;
#line 9 "../src/bezier.vala"
_tmp8_ = *bezier;
#line 9 "../src/bezier.vala"
_tmp9_ = _tmp8_.c1;
#line 9 "../src/bezier.vala"
_tmp10_ = *bezier;
#line 9 "../src/bezier.vala"
_tmp11_ = _tmp10_.c2;
#line 9 "../src/bezier.vala"
_tmp12_ = *bezier;
#line 9 "../src/bezier.vala"
_tmp13_ = _tmp12_.c3;
#line 9 "../src/bezier.vala"
_tmp14_ = *bezier;
#line 9 "../src/bezier.vala"
_tmp15_ = _tmp14_.c0;
#line 9 "../src/bezier.vala"
ay = ((3 * (_tmp9_.y - _tmp11_.y)) + _tmp13_.y) - _tmp15_.y;
#line 11 "../src/bezier.vala"
_tmp16_ = *bezier;
#line 11 "../src/bezier.vala"
_tmp17_ = _tmp16_.c0;
#line 11 "../src/bezier.vala"
_tmp18_ = *bezier;
#line 11 "../src/bezier.vala"
_tmp19_ = _tmp18_.c1;
#line 11 "../src/bezier.vala"
_tmp20_ = *bezier;
#line 11 "../src/bezier.vala"
_tmp21_ = _tmp20_.c2;
#line 11 "../src/bezier.vala"
bx = 3 * ((_tmp17_.x - (2 * _tmp19_.x)) + _tmp21_.x);
#line 12 "../src/bezier.vala"
_tmp22_ = *bezier;
#line 12 "../src/bezier.vala"
_tmp23_ = _tmp22_.c0;
#line 12 "../src/bezier.vala"
_tmp24_ = *bezier;
#line 12 "../src/bezier.vala"
_tmp25_ = _tmp24_.c1;
#line 12 "../src/bezier.vala"
_tmp26_ = *bezier;
#line 12 "../src/bezier.vala"
_tmp27_ = _tmp26_.c2;
#line 12 "../src/bezier.vala"
by = 3 * ((_tmp23_.y - (2 * _tmp25_.y)) + _tmp27_.y);
#line 14 "../src/bezier.vala"
_tmp28_ = *bezier;
#line 14 "../src/bezier.vala"
_tmp29_ = _tmp28_.c1;
#line 14 "../src/bezier.vala"
_tmp30_ = *bezier;
#line 14 "../src/bezier.vala"
_tmp31_ = _tmp30_.c0;
#line 14 "../src/bezier.vala"
cx = 3 * (_tmp29_.x - _tmp31_.x);
#line 15 "../src/bezier.vala"
_tmp32_ = *bezier;
#line 15 "../src/bezier.vala"
_tmp33_ = _tmp32_.c1;
#line 15 "../src/bezier.vala"
_tmp34_ = *bezier;
#line 15 "../src/bezier.vala"
_tmp35_ = _tmp34_.c0;
#line 15 "../src/bezier.vala"
cy = 3 * (_tmp33_.y - _tmp35_.y);
#line 17 "../src/bezier.vala"
_tmp36_ = *bezier;
#line 17 "../src/bezier.vala"
_tmp37_ = _tmp36_.c0;
#line 17 "../src/bezier.vala"
dx = _tmp37_.x;
#line 18 "../src/bezier.vala"
_tmp38_ = *bezier;
#line 18 "../src/bezier.vala"
_tmp39_ = _tmp38_.c0;
#line 18 "../src/bezier.vala"
dy = _tmp39_.y;
#line 20 "../src/bezier.vala"
_tmp40_ = *segment;
#line 20 "../src/bezier.vala"
_tmp41_ = _tmp40_.to;
#line 20 "../src/bezier.vala"
_tmp42_ = *segment;
#line 20 "../src/bezier.vala"
_tmp43_ = _tmp42_.from;
#line 20 "../src/bezier.vala"
vx = _tmp41_.y - _tmp43_.y;
#line 21 "../src/bezier.vala"
_tmp44_ = *segment;
#line 21 "../src/bezier.vala"
_tmp45_ = _tmp44_.from;
#line 21 "../src/bezier.vala"
_tmp46_ = *segment;
#line 21 "../src/bezier.vala"
_tmp47_ = _tmp46_.to;
#line 21 "../src/bezier.vala"
vy = _tmp45_.x - _tmp47_.x;
#line 23 "../src/bezier.vala"
_tmp48_ = *segment;
#line 23 "../src/bezier.vala"
_tmp49_ = _tmp48_.from;
#line 23 "../src/bezier.vala"
_tmp50_ = *segment;
#line 23 "../src/bezier.vala"
_tmp51_ = _tmp50_.from;
#line 23 "../src/bezier.vala"
d = (_tmp49_.x * vx) + (_tmp51_.y * vy);
#line 25 "../src/bezier.vala"
_tmp52_ = live_chart_get_cubic_roots ((vx * ax) + (vy * ay), (vx * bx) + (vy * by), (vx * cx) + (vy * cy), ((vx * dx) + (vy * dy)) - d);
#line 25 "../src/bezier.vala"
roots = _tmp52_;
#line 32 "../src/bezier.vala"
_tmp53_ = gee_array_list_new (LIVE_CHART_TYPE_COORD, (GBoxedCopyFunc) live_chart_coord_dup, (GDestroyNotify) live_chart_coord_free, NULL, NULL, NULL);
#line 32 "../src/bezier.vala"
results = _tmp53_;
#line 234 "bezier.c"
{
gint i = 0;
#line 33 "../src/bezier.vala"
i = 0;
#line 239 "bezier.c"
{
gboolean _tmp54_ = FALSE;
#line 33 "../src/bezier.vala"
_tmp54_ = TRUE;
#line 33 "../src/bezier.vala"
while (TRUE) {
#line 246 "bezier.c"
GeeList* _tmp56_;
gint _tmp57_;
gint _tmp58_;
gdouble* root = NULL;
GeeList* _tmp59_;
gpointer _tmp60_;
gboolean _tmp61_ = FALSE;
gdouble* _tmp62_;
GeeArrayList* _tmp64_;
gdouble* _tmp65_;
gdouble* _tmp66_;
gdouble* _tmp67_;
gdouble* _tmp68_;
gdouble* _tmp69_;
gdouble* _tmp70_;
LiveChartCoord _tmp71_ = {0};
#line 33 "../src/bezier.vala"
if (!_tmp54_) {
#line 265 "bezier.c"
gint _tmp55_;
#line 33 "../src/bezier.vala"
_tmp55_ = i;
#line 33 "../src/bezier.vala"
i = _tmp55_ + 1;
#line 271 "bezier.c"
}
#line 33 "../src/bezier.vala"
_tmp54_ = FALSE;
#line 33 "../src/bezier.vala"
_tmp56_ = roots;
#line 33 "../src/bezier.vala"
_tmp57_ = gee_collection_get_size ((GeeCollection*) _tmp56_);
#line 33 "../src/bezier.vala"
_tmp58_ = _tmp57_;
#line 33 "../src/bezier.vala"
if (!(i < _tmp58_)) {
#line 33 "../src/bezier.vala"
break;
#line 285 "bezier.c"
}
#line 34 "../src/bezier.vala"
_tmp59_ = roots;
#line 34 "../src/bezier.vala"
_tmp60_ = gee_list_get (_tmp59_, i);
#line 34 "../src/bezier.vala"
root = (gdouble*) _tmp60_;
#line 35 "../src/bezier.vala"
_tmp62_ = root;
#line 35 "../src/bezier.vala"
if (((gdouble) 0) > (*_tmp62_)) {
#line 35 "../src/bezier.vala"
_tmp61_ = TRUE;
#line 299 "bezier.c"
} else {
gdouble* _tmp63_;
#line 35 "../src/bezier.vala"
_tmp63_ = root;
#line 35 "../src/bezier.vala"
_tmp61_ = (*_tmp63_) > ((gdouble) 1);
#line 306 "bezier.c"
}
#line 35 "../src/bezier.vala"
if (_tmp61_) {
#line 35 "../src/bezier.vala"
_g_free0 (root);
#line 35 "../src/bezier.vala"
continue;
#line 314 "bezier.c"
}
#line 36 "../src/bezier.vala"
_tmp64_ = results;
#line 36 "../src/bezier.vala"
_tmp65_ = root;
#line 36 "../src/bezier.vala"
_tmp66_ = root;
#line 36 "../src/bezier.vala"
_tmp67_ = root;
#line 36 "../src/bezier.vala"
_tmp68_ = root;
#line 36 "../src/bezier.vala"
_tmp69_ = root;
#line 36 "../src/bezier.vala"
_tmp70_ = root;
#line 36 "../src/bezier.vala"
_tmp71_.x = (((((ax * (*_tmp65_)) + bx) * (*_tmp66_)) + cx) * (*_tmp67_)) + dx;
#line 36 "../src/bezier.vala"
_tmp71_.y = (((((ay * (*_tmp68_)) + by) * (*_tmp69_)) + cy) * (*_tmp70_)) + dy;
#line 36 "../src/bezier.vala"
gee_abstract_collection_add ((GeeAbstractCollection*) _tmp64_, &_tmp71_);
#line 33 "../src/bezier.vala"
_g_free0 (root);
#line 338 "bezier.c"
}
}
}
#line 42 "../src/bezier.vala"
result = (GeeList*) results;
#line 42 "../src/bezier.vala"
_g_object_unref0 (roots);
#line 42 "../src/bezier.vala"
return result;
#line 348 "bezier.c"
}
static gdouble*
_double_dup (gdouble* self)
{
gdouble* dup;
#line 47 "../src/bezier.vala"
dup = g_new0 (gdouble, 1);
#line 47 "../src/bezier.vala"
memcpy (dup, self, sizeof (gdouble));
#line 47 "../src/bezier.vala"
return dup;
#line 361 "bezier.c"
}
GeeList*
live_chart_get_cubic_roots (gdouble C3,
gdouble C2,
gdouble C1,
gdouble C0)
{
GeeArrayList* roots = NULL;
GeeArrayList* _tmp0_;
gdouble c3 = 0.0;
gdouble c2 = 0.0;
gdouble c1 = 0.0;
gdouble c0 = 0.0;
gdouble a = 0.0;
gdouble b = 0.0;
gdouble offset = 0.0;
gdouble discrim = 0.0;
gdouble halfB = 0.0;
gdouble tmp = 0.0;
gdouble root = 0.0;
GeeList* result;
#line 47 "../src/bezier.vala"
_tmp0_ = gee_array_list_new (G_TYPE_DOUBLE, (GBoxedCopyFunc) _double_dup, (GDestroyNotify) g_free, NULL, NULL, NULL);
#line 47 "../src/bezier.vala"
roots = _tmp0_;
#line 50 "../src/bezier.vala"
c3 = C3;
#line 51 "../src/bezier.vala"
c2 = C2 / c3;
#line 52 "../src/bezier.vala"
c1 = C1 / c3;
#line 53 "../src/bezier.vala"
c0 = C0 / c3;
#line 55 "../src/bezier.vala"
a = ((3 * c1) - (c2 * c2)) / 3;
#line 56 "../src/bezier.vala"
b = (((((2 * c2) * c2) * c2) - ((9 * c1) * c2)) + (27 * c0)) / 27;
#line 57 "../src/bezier.vala"
offset = c2 / 3;
#line 58 "../src/bezier.vala"
discrim = ((b * b) / 4) + (((a * a) * a) / 27);
#line 59 "../src/bezier.vala"
halfB = b / 2;
#line 61 "../src/bezier.vala"
tmp = (gdouble) 0;
#line 62 "../src/bezier.vala"
root = (gdouble) 0;
#line 64 "../src/bezier.vala"
if (fabs (discrim) <= LIVE_CHART_POLYNOMIAL_TOLERANCE) {
#line 64 "../src/bezier.vala"
discrim = (gdouble) 0;
#line 414 "bezier.c"
}
#line 66 "../src/bezier.vala"
if (discrim > ((gdouble) 0)) {
#line 418 "bezier.c"
gdouble e = 0.0;
GeeArrayList* _tmp1_;
gdouble _tmp2_;
#line 67 "../src/bezier.vala"
e = sqrt (discrim);
#line 69 "../src/bezier.vala"
tmp = (-halfB) + e;
#line 70 "../src/bezier.vala"
if (tmp >= ((gdouble) 0)) {
#line 70 "../src/bezier.vala"
root = pow (tmp, (gdouble) (1 / 3));
#line 430 "bezier.c"
} else {
#line 71 "../src/bezier.vala"
root = -pow (-tmp, (gdouble) (1 / 3));
#line 434 "bezier.c"
}
#line 73 "../src/bezier.vala"
tmp = (-halfB) - e;
#line 74 "../src/bezier.vala"
if (tmp >= ((gdouble) 0)) {
#line 74 "../src/bezier.vala"
root += pow (tmp, (gdouble) (1 / 3));
#line 442 "bezier.c"
} else {
#line 75 "../src/bezier.vala"
root -= pow (-tmp, (gdouble) (1 / 3));
#line 446 "bezier.c"
}
#line 77 "../src/bezier.vala"
_tmp1_ = roots;
#line 77 "../src/bezier.vala"
_tmp2_ = root - offset;
#line 77 "../src/bezier.vala"
gee_abstract_collection_add ((GeeAbstractCollection*) _tmp1_, &_tmp2_);
#line 454 "bezier.c"
} else {
#line 78 "../src/bezier.vala"
if (discrim < ((gdouble) 0)) {
#line 458 "bezier.c"
gdouble distance = 0.0;
gdouble angle = 0.0;
gdouble _cos = 0.0;
gdouble _sin = 0.0;
gdouble sqrt3 = 0.0;
GeeArrayList* _tmp3_;
gdouble _tmp4_;
GeeArrayList* _tmp5_;
gdouble _tmp6_;
GeeArrayList* _tmp7_;
gdouble _tmp8_;
#line 79 "../src/bezier.vala"
distance = sqrt ((-a) / 3);
#line 80 "../src/bezier.vala"
angle = atan2 (sqrt (-discrim), -halfB) / 3;
#line 81 "../src/bezier.vala"
_cos = cos (angle);
#line 82 "../src/bezier.vala"
_sin = sin (angle);
#line 83 "../src/bezier.vala"
sqrt3 = sqrt ((gdouble) 3);
#line 85 "../src/bezier.vala"
_tmp3_ = roots;
#line 85 "../src/bezier.vala"
_tmp4_ = ((2 * distance) * _cos) - offset;
#line 85 "../src/bezier.vala"
gee_abstract_collection_add ((GeeAbstractCollection*) _tmp3_, &_tmp4_);
#line 86 "../src/bezier.vala"
_tmp5_ = roots;
#line 86 "../src/bezier.vala"
_tmp6_ = ((-distance) * (_cos + (sqrt3 * _sin))) - offset;
#line 86 "../src/bezier.vala"
gee_abstract_collection_add ((GeeAbstractCollection*) _tmp5_, &_tmp6_);
#line 87 "../src/bezier.vala"
_tmp7_ = roots;
#line 87 "../src/bezier.vala"
_tmp8_ = ((-distance) * (_cos - (sqrt3 * _sin))) - offset;
#line 87 "../src/bezier.vala"
gee_abstract_collection_add ((GeeAbstractCollection*) _tmp7_, &_tmp8_);
#line 498 "bezier.c"
} else {
GeeArrayList* _tmp9_;
gdouble _tmp10_;
GeeArrayList* _tmp11_;
gdouble _tmp12_;
#line 89 "../src/bezier.vala"
if (halfB >= ((gdouble) 0)) {
#line 89 "../src/bezier.vala"
tmp = -pow (halfB, (gdouble) (1 / 3));
#line 508 "bezier.c"
} else {
#line 90 "../src/bezier.vala"
tmp = pow (-halfB, (gdouble) (1 / 3));
#line 512 "bezier.c"
}
#line 92 "../src/bezier.vala"
_tmp9_ = roots;
#line 92 "../src/bezier.vala"
_tmp10_ = (2 * tmp) - offset;
#line 92 "../src/bezier.vala"
gee_abstract_collection_add ((GeeAbstractCollection*) _tmp9_, &_tmp10_);
#line 94 "../src/bezier.vala"
_tmp11_ = roots;
#line 94 "../src/bezier.vala"
_tmp12_ = (-tmp) - offset;
#line 94 "../src/bezier.vala"
gee_abstract_collection_add ((GeeAbstractCollection*) _tmp11_, &_tmp12_);
#line 526 "bezier.c"
}
}
#line 97 "../src/bezier.vala"
result = (GeeList*) roots;
#line 97 "../src/bezier.vala"
return result;
#line 533 "bezier.c"
}