Korken skrev:Jag ska kolla på arctan2 funktionen och se om den förenklar mitt program.

Vad sägs om följande lösning?
Kod: Markera allt
#define MY_ARCTAN_TABLE_SIZE ...
#define MY_ARCTAN_PI ...
/* Värden från 0 grader till 45 grader, index är (MY_ARCTAN_TABLE_SIZE * y)/x för y < x. */
int my_arctan_table[MY_ARCTAN_TABLE_SIZE] = {...};
int my_arctan2(int x, int y)
{
if (x > 0) {
if (y > 0) {
return my_arctan2_bothpositive(x, y);
} else if (y == 0) {
return 0;
} else {
return 2 * MY_ARCTAN_PI - my_arctan2_bothpositive(x, -y);
}
} else if (x == 0) {
if (y > 0) {
return MY_ARCTAN_PI / 2;
} else if (y == 0) {
return 0;
} else {
return MY_ARCTAN_PI + MY_ARCTAN_PI / 2;
}
} else {
if (y > 0) {
return MY_ARCTAN_PI - my_arctan2_bothpositive(-x, y);
} else if (y == 0) {
return MY_ARCTAN_PI;
} else {
return MY_ARCTAN_PI + my_arctan2_bothpositive(-x, -y);
}
}
}
int my_arctan2_bothpositive(int x, int y)
{
if (y < x) {
return my_arctan_table[(MY_ARCTAN_TABLE_SIZE * y) / x];
} else if (y == x) {
return MY_ARCTAN_PI / 4;
} else {
return MY_ARCTAN_PI / 2 - my_arctan_table[(MY_ARCTAN_TABLE_SIZE * x) / y];
}
}
Skissade ihop det spontant nu, bäst att testa i datorn först! Fördelen med denna metod är att du bara behöver ha intervallet från 0 till 45 grader i tabellen, där spridningen är någorlunda linjär.
Har du inte x och y utan bara en kvot så kan du ju anropa my_arctan2(1, kvot), då blir y / x = kvot / 1 = kvot.
Edit: Sitter och optimerar koden, och har ramlar över en konstig error.
(alla variabler är pekare)
Kod: Markera allt
ptr = (start + end)/2; ger error: invalid operands to binary + (have ‘int *’ and ‘int *’) men,
ptr = start + (end - start)/2; fungerar
Hur kan det bli så?
Du kan inte plussa ihop två pekare! Om kompilatorn inte varnade skulle du få en pekare som är åt tjottaheitti. Om (start = base + index_start) och (end = base + index_end) så är (start + end) lika med (base + base + index_start + index_end) - du ser felet?
Okej, du dividerar resultatet med två. Men då är problemet att du kan hamna mellan två index, beroende på datatypens storlek. Gör så här istället: ptr = base + (index_start + index_end) / 2. Helst ska du räkna med index så långt som möjligt och blanda in tabellpekaren först när du läser ur minnet.