if teller==setpoint then return 255
else if teller==(setpoint-90) then return 0
else if teller==(setpoint+90) then return 0
Ik heb zomaar wat neergekladderd, maar het lijkt me dat je dat zelf ook wel had verzonnen, vandaar m'n idee dat je nog iets anders bedoelt.
ja bedoel dus iets anders... is het setpoint gelijk... komt er 255 uit... maar staat de graden teller 1 voor of 1 graad na het setpoint, moet er 254 uit komen.... en zo totdat 90 graden voor of na, dan een 0 ....
en de teller loopt rond van 0 naar 360 .... dus als het setpoint op 340 staat... (pff hoe zeg je dat...) ja dan gaat hij dus 70 voorbij de 360 (als ik met 90 voor en na werk...) maar dan moet het dus ook goed gaan.....
private int distance(int alpha, int beta) {
int phi = Math.abs(beta - alpha) % 360; // This is either the distance or 360 - distance
int distance = phi > 180 ? 360 - phi : phi;
return distance;
}
phi = abs( beta - alpha ) mod 360
if (phi > 180) then phi = 360 - phi
Wat je doet is de punten samen over de circel verdraaien zodat eentje precies op nul ligt, dan reken je de hoek uit tussen de twee punten. Maar je weet dat wanneer de hoek groter dan 180 graden is, er via de andere kant een kleinere hoek is, dus die bereken je vervolgens. Nu ken je de kleinste hoek (phi), de rest van de logica kan je dan zelf naar wens bijvoegen.
Neem alpha als het setpoint, beta de actuele hoek. Maar het maakt wiskundig niet uit of je het omdraait omdat je het absoluut maakt: 1-2 is dan hetzelfde als 2-1.
phi is het kleinste verschil.
ja... (had even een ander verhaal tussen door... maar ga nu weer verder met me emmers... :-) )
ik weet dan waarde waarde terecht komt, als hij over de 360 heen gaat.... maar ik weet eigenlijk niet hoe ik dan verder moet...
dus nog 1 keer omschrijven wat ik wil.....
ik heb een teller (rond om een cirkel) welke tel van 0 naar 360... , deze waarde gaat een functie in, en een setpoint waarde...
en nu wil ik eigenlijk net als een soort vuurtoren licht een getal terug krijgen, als de teller in de buurtkomt van het setpoint.... dat er dan 255 uitkomt, als setpoint=teller en dat die waarde bijvoorbeeld 90 voor en 90 na het setpoint van 0 tot dus die 255 loopt....
maar ik zit heel erg te k#tten met door die 360-0 grens .... en toen dacht ik , ik tel bij alle getallen 360 op... maar dan heb ik dat de getal welke omrekent "van zoveel graden verschil naar het 255 verhaal" niet meer klopt, komt er opeens boven de 255 uit....
Ehm,
Stel je setpoint=160 en je teller=150 dan wil je dus het verschil tussen die 2, zijnde 10, afgetrokken van 255 dus 255-(160-150) geeft 245.
Maar omdat het voorbeeld met teller 170 dan -10 zou opleveren gebruik je dus abs(160-170)=10
En jouw probleem met 355 en 5 zou ook 10 moeten opleveren (eigenlijk 255-10=254) los jij op met 360 optellen bij zowel de teller als het setpoint, ik zou niet weten wat daar mis mee is.
Het grootste verschil wordt dan 180, en niet 90, wat ik denk dat jij in je hoofd hebt.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
FUNCTION StapelPatroon3D::ColorGrad
VAR_INPUT
CurrentAngle : DINT;
BrightestAngle : DINT; // hoek waar dit vlak op zijn helderst moet zijn
Maxlength : DINT; // totaal aantal graden waarin de kleur varieert (midden is het helderst)
ColorSpread : DINT; // stappen tussen licht en donker ( max 255)
END_VAR
VAR_OUTPUT
colorBack : UINT;
END_VAR
VAR
phi : dint;
END_VAR
if ColorSpread>255 then
ColorSpread := 255;
end_if;
phi := abs( CurrentAngle - BrightestAngle ) mod 360;
if (phi > 180) then
phi := 360 - phi;
end_if;
if (phi <= 90) then
colorBack := to_uint(255 - (255 * (phi/90))) ;
else
colorBack := 0;
end_if;
END_FUNCTION
VAR_INPUT
CurrentAngle : DINT;
BrightestAngle : DINT; // hoek waar dit vlak op zijn helderst moet zijn
Maxlength : DINT; // totaal aantal graden waarin de kleur varieert (midden is het helderst)
ColorSpread : DINT; // stappen tussen licht en donker ( max 255)
END_VAR
VAR_OUTPUT
colorBack : UINT;
END_VAR
VAR
phi : dint;
END_VAR
if ColorSpread>255 then
ColorSpread := 255;
end_if;
phi := abs( CurrentAngle - BrightestAngle ) mod 360;
if (phi > 180) then
phi := 360 - phi;
end_if;
if (phi <= 90) then
colorBack := to_uint(255 - (255 * (to_real(phi)/90.0))) ;
else
colorBack := 0;
end_if;
END_FUNCTION
heel erg bedankt.... tis zo kort en simpel.... ik had echt een gigantisch verhaal... en dan nog ging hij hier en daar af en toe fout....
Maar ik snap de MOD ook niet helemaal precies... althans ik snap wel dat hij kijkt hoe vaak iets gedeeld kan worden door een bepaald getal... maar wat ik er nu echt mee kan?
dat zie ik eigenlijk nog niet zo...? :-)
Breaker schreef:Je hebt de ‘modulus’ functie nodig om hier uit te komen, en die zie ik niet in je code...
hugo stoutjesdijk schreef:Ehm,
Dat was inderdaad iets te stellig. Had pas de situatie waarin het setpoint tussen 0-360 lag terwijl de actuele hoek veel groter kon zijn (bv een A-as die verschillende keren rond is geweest), dan werkt de truc met 360 optellen niet, hier wel.
Swets schreef:Maar ik snap de MOD ook niet helemaal precies...
Modulus is niets anders dan de 'rest' die je op school leerde, 10:3 = 3 rest 1, of 22:5 = 4 rest 2. Ideaal voor assen waar je weet dat de werkelijke positie altijd ergens tussen de 0-360 ligt en niet geinteresseerd bent in hoe vaak de as zelf is rondgeweest.