Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Administrator
Versuch es mal mit float und der Norm sqrt(x*x + y*y).
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
//regular a-star while(!open.empty()) { opened current = open.front(); open.pop_front(); size_t c_index = this->getindex(current.x,current.y); float current_height = heights[c_index]; //expandNode(current) for(int counter = 0; counter < 6; counter++) { int n_x = current.x + (current.y%2 ? neighbours_odd : neighbours_even)[counter][0]; int n_y = current.y + (current.y%2 ? neighbours_odd : neighbours_even)[counter][1]; if(0 <= n_x && n_x < grid_width && 0 <= n_y && n_y < grid_height) { size_t n_index = getindex(n_x,n_y); if(!closed[n_index]) { float h_diff = heights[n_index] - current_height; Val tentative_g = static_cast<Val>(values[c_index] + sqrt(1+h_diff*h_diff));//cost to every closest neighbor is 1 in a hex-grid if(this->infinit[n_index] || tentative_g < this->values[n_index]) { this->infinit[n_index] = false; this->values[n_index] = tentative_g; opened val(n_x,n_y,tentative_g+get_approx_cost(n_x,n_y,n_index,x,y,startindex)); bool inserted = false; typename std::list<opened>::iterator it = open.begin(); while(it != open.end()) { if(it->x == n_x && it->y == n_y) it = open.erase(it); else { if(!inserted && val.approx_cost < it->approx_cost) { inserted = true; it = open.insert(it, val); } ++it; } } if(!inserted) open.push_back(val); } } } } closed[c_index] = true; if(current.x == ret.first && current.y == ret.second) break; } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nox« (04.08.2013, 23:21)
Zitat
Warum sollte std::vector besser sein? Immerhin wird ja immer vorne ein element entfernt und ein neues element irgendwo dazwischen gepackt.
Zitat
Also quasi Luftlinie. Was daran falsch sein soll, verstehe ich gerade nicht.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nox« (05.08.2013, 14:22)
Vielleicht solltest du mal lesen? Die Probleme davon habe ich in meinem letzten Post aufgelistet. Was ist daran nicht zu verstehen, dass man im Grid nicht die Luftlinie ablaufen kann?Ich weiß gerade nicht ob wir aneinander vorbeireden, aber sqrt(x*x+y*y) sollte man als Schätzer für die Kosten nutzen. Also quasi Luftlinie. Was daran falsch sein soll, verstehe ich gerade nicht.
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Nox« (05.08.2013, 15:29)
Werbeanzeige