Discrete Fourier Transform: GeoGebra logo

θ = Slider(-pi, pi, 0.01, 1, 140, false, true, false, false) kMax = Slider(1, 98, 1, 1, 140, false, true, false, false) #Execute(Sequence("", i, 1, m)) ##Set the number of points for approximating the curve. The bigger the number the more complex the curve can be ## m=197 ##Create Points: I need sliders so the points can be changed by user## Execute(Sequence("XP"+i+" = Slider(-300, 300, 0.01, 1, 130, false, true, false, false)", i, 1, m)) Execute(Sequence("YP"+i+" = Slider(-300, 300, 0.01, 1, 130, false, true, false, false)", i, 1, m)) Execute(Sequence("SetValue(XP"+i+", A"+i+")", i, 1, m)) Execute(Sequence("SetValue(YP"+i+", B"+i+")", i, 1, m)) Execute(Sequence("SetVisibleInView(XP"+i+", 1, false)", i, 1, m)) Execute(Sequence("SetVisibleInView(YP"+i+", 1, false)", i, 1, m)) Polygonal = true SetVisibleInView(Polygonal, 1, false) SetVisibleInView(Polygonal, 2, true) Execute(Sequence("P"+i+" = (XP"+i+", YP"+i+")", i, 1, m)) Execute(Sequence("SetConditionToShowObject(P"+i+", Polygonal)", i, 1, m)) Execute(Sequence("ShowLabel(P"+i+", false)", i, 1, m)) listP = P1:P197 size = Length(listP) n = (size - 1)/2 ##This will be used for the Discrete Fourier Series## listT = Sequence(2π k / (2n + 1), k, 0, 2n) ##This slider is for showing a number of orbits. In this case, the number of orbits is 2 times kMax## ##I need to divide the list of points determined by their position: Positive and Negative## listPPos = Sequence(Element(listP, k), k, (size + 1) / 2 + 1, size) SetVisibleInView(listPPos, 1, false) listPNeg = Sequence(Element(listP, k), k, 1, (size + 1) / 2 - 1) SetVisibleInView(listPNeg, 1, false) ##Not sure why I need this T## T = Element(listT, (size + 1) / 2) ##Here we find the constants in the Discrete Fourier transform## listC = Sequence(Sum(Sequence(((cos(k Element(listT, l)) x(Element(listP, l)) + sin(k Element(listT, l)) y(Element(listP, l))) / size, (cos(k Element(listT, l)) y(Element(listP, l)) - sin(k Element(listT, l)) x(Element(listP, l))) / size), l, 1, size)), k, -n, n) SetVisibleInView(listC, 1, false) listCPos = Sequence(Element(listC, k), k, (size + 1) / 2 + 1, size) SetVisibleInView(listCPos, 1, false) listCNeg = Reverse(Sequence(Element(listC, k), k, 1, (size + 1) / 2 - 1)) SetVisibleInView(listCNeg, 1, false) C = Element(listC, (size + 1) / 2) xC = x(C) yC = y(C) fx(x) = Sum(Sequence(cos(k x) x(Element(listCPos, k)) - sin(k x) y(Element(listCPos, k)) + cos(-k x) x(Element(listCNeg, k)) - sin(-k x) y(Element(listCNeg, k)), k, 1, kMax)) SetVisibleInView(fx, 1, false) fy(x) = Sum(Sequence(cos(k x) y(Element(listCPos, k)) + sin(k x) x(Element(listCPos, k)) + cos(-k x) y(Element(listCNeg, k)) + sin(-k x) x(Element(listCNeg, k)), k, 1, kMax)) SetVisibleInView(fy, 1, false) Curve = true SetVisibleInView(Curve, 1, false) SetVisibleInView(Curve, 2, true) path = Curve(x(C) + fx(t), y(C) + fy(t), t, -3.14159, π) SetConditionToShowObject(path, Curve) listCOrd = Join(Sequence({Element(listCPos, k), Element(listCNeg, k)}, k, 1, n)) SetVisibleInView(listCOrd, 1, false) listCRho = Sequence(Length(Element(listCOrd, k)), k, 1, size - 1) listCAng = Sequence(Angle(Element(listCOrd, k)), k, 1, size - 1) ##I need to create a list of numbers in order to have a specific order to create the orbits. This order is not unique. listHelp = Sequence((Length(Element(listCOrd, k)); Angle(Element(listCOrd, k))), k, 1, size - 1) SetVisibleInView(listHelp, 1, false) sortHelper = Reverse(Sort(Sequence((Length(Element(listHelp, i)), i), i, 1, Length(listHelp)))) SetVisibleInView(sortHelper, 1, false) listSorted = Sequence(y(Element(sortHelper, i)), i, 1, Length(sortHelper)) #Reverse(Sequence(Element(listHelp, y(Element(sortHelper, i))), i, 1, Length(listHelp))) listK = Join(Sequence({k, -k}, k, 1, n)) Orbits = false SetVisibleInView(Orbits, 1, false) SetVisibleInView(Orbits, 2, true) #Centers of orbits listCenters = Join({{C}, Sequence(C + Sum(Sequence((Element(listCRho, Element(listSorted, r)) cos(Element(listCAng, Element(listSorted, r)) + Element(listK, Element(listSorted, r)) θ), Element(listCRho, Element(listSorted, r)) sin(Element(listCAng, Element(listSorted, r)) + Element(listK, Element(listSorted, r)) θ)), r, 1, l)), l, 1, 2kMax)}) SetConditionToShowObject(listCenters, Orbits) P = Element(listCenters, 2*kMax + 1) Play = false SetVisibleInView(Play, 1, false) SetVisibleInView(Play, 2, true) listCircles = Sequence(Circle(Element(listCenters, k), Element(listCRho, Element(listSorted, k))), k, 1, 2*kMax) SetConditionToShowObject(listCircles, Orbits) #Radii listS = Sequence(Segment(Element(listCenters, k), Element(listCenters, k + 1)), k, 1, 2*kMax) SetConditionToShowObject(listS, Orbits) #Polygonal curve listPC = Sequence(Segment(Element(listP, u), Element(listP, Mod(u, size) + 1)), u, 1, size) SetConditionToShowObject(listPC, Polygonal)