Skip to content

Commit 9eb5cc4

Browse files
committed
fix: error & astar
1 parent 1f8010f commit 9eb5cc4

File tree

3 files changed

+50
-43
lines changed

3 files changed

+50
-43
lines changed

Library/PAX_MAHOROBA/Map/Simulation/SettlementRenderer.hpp

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ namespace paxs {
276276
}
277277

278278
/// @brief 移動線を描画
279-
/// @brief Draw movement lines
279+
/// @brief Draw movement lines
280280
static void drawMovementLines(
281281
const paxs::UnorderedMap<SettlementGridsType, paxs::SettlementGrid>* agents,
282282
const std::vector<GridType4>* marriage_pos_list,
@@ -299,22 +299,28 @@ namespace paxs {
299299

300300
if (settlement.getOldPosition().x == -1 || settlement.getOldPosition().x == 0) continue;
301301

302-
// 修正箇所: A*の経路データがある場合 (通常2点以上入っているはず)
303-
if (settlement.getPositions().size() >= 2) {
302+
// 修正箇所: サイズチェックは安全のため >= 2 が望ましいですが、元の >= 1 でも動作します
303+
if (settlement.getPositions().size() >= 1) {
304304
// スプライン曲線で移動履歴を描画
305305
std::vector<paxs::Vector2<double>> spline_points;
306306
spline_points.emplace_back(draw_pos);
307307

308-
// A*が生成した [Start -> ... -> End] の順序をそのまま使用する
309-
// 余計な draw_pos(End) や old_pos(Start) の追加は行わない
310-
for (const auto& p : settlement.getPositions()) {
308+
// =========================================================
309+
// 【修正】パスを逆順(rbegin -> rend)で追加する
310+
// これにより [現在地(終点)] -> [パス終点...パス始点] -> [過去地(始点)] と繋がり
311+
// 滑らかな曲線になります。
312+
// =========================================================
313+
const auto& path_positions = settlement.getPositions();
314+
for (auto it = path_positions.rbegin(); it != path_positions.rend(); ++it) {
315+
const auto& p = *it;
311316
const auto one_coord = positionToWebMercator(paxs::Vector2<int>(p.x, p.y));
312317
const paxs::Vector2<double> one_pos = MapCoordinateConverter::toScreenPos(
313318
one_coord,
314319
map_view_size,
315320
map_view_center);
316321
spline_points.emplace_back(one_pos);
317322
}
323+
// =========================================================
318324

319325
const auto old_coord = positionToWebMercator(settlement.getOldPosition());
320326
const paxs::Vector2<double> old_pos = MapCoordinateConverter::toScreenPos(
@@ -323,23 +329,21 @@ namespace paxs {
323329
map_view_center);
324330
spline_points.emplace_back(old_pos);
325331

326-
// 矢印を描画 (パスの最後の区間に矢印を乗せる)
327-
if (spline_points.size() >= 2) {
328-
const auto& last = spline_points.back();
329-
const auto& prev = spline_points[spline_points.size() - 2];
332+
paxg::Spline2D(spline_points).draw(MOVEMENT_LINE_WIDTH, paxg::Color(0, 0, 0));
330333

331-
// 矢印を描画
332-
const auto first_coord = positionToWebMercator(settlement.getPositions()[0]);
333-
const paxs::Vector2<double> first_pos = MapCoordinateConverter::toScreenPos(
334-
first_coord,
335-
map_view_size,
336-
map_view_center);
337-
paxg::Line{ first_pos, draw_pos }
338-
.drawArrow(MOVEMENT_ARROW_LINE_WIDTH, paxs::Vector2<float>{ 8.0f, 16.0f }, paxg::Color(0, 0, 0));
339-
}
334+
// 矢印を描画
335+
// ※A*が[始点->終点]の順序なので、Positions[0]は「始点側」です。
336+
// 矢印は「始点付近」から「現在地」へ向かう線で正しいので、ここは変更不要です。
337+
const auto first_coord = positionToWebMercator(settlement.getPositions()[0]);
338+
const paxs::Vector2<double> first_pos = MapCoordinateConverter::toScreenPos(
339+
first_coord,
340+
map_view_size,
341+
map_view_center);
342+
paxg::Line{ first_pos, draw_pos }
343+
.drawArrow(MOVEMENT_ARROW_LINE_WIDTH, paxs::Vector2<float>{ 8.0f, 16.0f }, paxg::Color(0, 0, 0));
340344
}
341345
else {
342-
// A*データがない、または単純移動の場合 (直線)
346+
// 単純な移動線
343347
const auto old_coord = positionToWebMercator(settlement.getOldPosition());
344348
const paxs::Vector2<double> old_pos = MapCoordinateConverter::toScreenPos(
345349
old_coord,

Projects/UnitTest/Source/PAX_SAPIENTICA/Simulation/Entity/SettlementAgentUnitTest.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*##########################################################################################
1+
/*##########################################################################################
22
33
PAX SAPIENTICA Library 💀🌿🌏
44
@@ -44,7 +44,10 @@ TEST(SettlementAgentUnitTest, ParameterizedConstruction) {
4444
genome,
4545
100, // farming
4646
50, // hunter_gatherer
47-
5 // language
47+
5, // language
48+
1, // pottery_make
49+
2, // pottery_lineage
50+
0 // rice_type
4851
);
4952

5053
// Then: 全てのプロパティが正しく設定される
@@ -193,7 +196,7 @@ TEST(SettlementAgentUnitTest, Marry_SetsMarriedStatus) {
193196
partner_genome.setYDNA(5);
194197

195198
// When: 結婚
196-
agent.marry(2, partner_genome, 80, 20, 8);
199+
agent.marry(2, partner_genome, 80, 20, 8, 0, 0);
197200

198201
// Then: 婚姻状態になる
199202
EXPECT_TRUE(agent.isMarried());
@@ -216,7 +219,7 @@ TEST(SettlementAgentUnitTest, Marry_StoresPartnerInfo) {
216219
std::uint8_t groom_language = 8;
217220

218221
// When: 結婚
219-
bride.marry(groom_id, father_genome, groom_farming, groom_hunter, groom_language);
222+
bride.marry(groom_id, father_genome, groom_farming, groom_hunter, groom_language, 0, 0);
220223

221224
// Then: 配偶者情報が保存される
222225
EXPECT_EQ(bride.getPartnerId(), groom_id);
@@ -230,7 +233,7 @@ TEST(SettlementAgentUnitTest, Marry_StoresPartnerInfo) {
230233
TEST(SettlementAgentUnitTest, Divorce_ClearsMarriedStatus) {
231234
// Given: 結婚しているエージェント
232235
paxs::SettlementAgent agent(1, 25, 60, paxs::Genome(), 100, 0, 5);
233-
agent.marry(2, paxs::Genome(), 80, 20, 8);
236+
agent.marry(2, paxs::Genome(), 80, 20, 8, 0, 0);
234237
ASSERT_TRUE(agent.isMarried());
235238

236239
// When: 離婚
@@ -243,7 +246,7 @@ TEST(SettlementAgentUnitTest, Divorce_ClearsMarriedStatus) {
243246
TEST(SettlementAgentUnitTest, Divorce_ClearsPartnerId) {
244247
// Given: 結婚しているエージェント
245248
paxs::SettlementAgent agent(1, 25, 60, paxs::Genome(), 100, 0, 5);
246-
agent.marry(2, paxs::Genome(), 80, 20, 8);
249+
agent.marry(2, paxs::Genome(), 80, 20, 8, 0, 0);
247250
ASSERT_EQ(agent.getPartnerId(), 2);
248251

249252
// When: 離婚
@@ -323,7 +326,7 @@ TEST(SettlementAgentUnitTest, IsAbleToMarriage_AlreadyMarried) {
323326
paxs::SettlementAgent agent(1, age_in_steps, 1000, genome, 100, 0, 5);
324327

325328
// When: 結婚
326-
agent.marry(2, paxs::Genome(), 80, 20, 8);
329+
agent.marry(2, paxs::Genome(), 80, 20, 8, 0, 0);
327330

328331
// Then: 婚姻不可(既婚)
329332
EXPECT_FALSE(agent.isAbleToMarriage());
@@ -342,7 +345,7 @@ TEST(SettlementAgentUnitTest, IsAbleToGiveBirth_Female_WithinAgeRange_Married) {
342345
genome.setYDNA(0); // Female
343346
paxs::AgeType age_in_steps = static_cast<paxs::AgeType>(28 * config.steps_per_year);
344347
paxs::SettlementAgent agent(1, age_in_steps, 1000, genome, 100, 0, 5);
345-
agent.marry(2, paxs::Genome(), 80, 20, 8);
348+
agent.marry(2, paxs::Genome(), 80, 20, 8, 0, 0);
346349

347350
// Then: 出産可能
348351
EXPECT_TRUE(agent.isAbleToGiveBirth());
@@ -371,7 +374,7 @@ TEST(SettlementAgentUnitTest, IsAbleToGiveBirth_Female_TooYoung) {
371374
genome.setYDNA(0); // Female
372375
paxs::AgeType age_in_steps = static_cast<paxs::AgeType>(10 * config.steps_per_year);
373376
paxs::SettlementAgent agent(1, age_in_steps, 1000, genome, 100, 0, 5);
374-
agent.marry(2, paxs::Genome(), 80, 20, 8);
377+
agent.marry(2, paxs::Genome(), 80, 20, 8, 0, 0);
375378

376379
// Then: 出産不可(若すぎる)
377380
EXPECT_FALSE(agent.isAbleToGiveBirth());
@@ -386,7 +389,7 @@ TEST(SettlementAgentUnitTest, IsAbleToGiveBirth_Female_TooOld) {
386389
genome.setYDNA(0); // Female
387390
paxs::AgeType age_in_steps = static_cast<paxs::AgeType>(50 * config.steps_per_year);
388391
paxs::SettlementAgent agent(1, age_in_steps, 1000, genome, 100, 0, 5);
389-
agent.marry(2, paxs::Genome(), 80, 20, 8);
392+
agent.marry(2, paxs::Genome(), 80, 20, 8, 0, 0);
390393

391394
// Then: 出産不可(高齢)
392395
EXPECT_FALSE(agent.isAbleToGiveBirth());
@@ -475,7 +478,7 @@ TEST(SettlementAgentUnitTest, PartnerCulturalAttributes) {
475478
paxs::SettlementAgent agent(1, 25, 60, paxs::Genome(), 100, 0, 5);
476479

477480
// When: 文化的属性が異なる配偶者と結婚
478-
agent.marry(2, paxs::Genome(), 80, 120, 8);
481+
agent.marry(2, paxs::Genome(), 80, 120, 8, 0, 0);
479482

480483
// Then: 配偶者の文化属性が取得できる
481484
EXPECT_EQ(agent.cgetPartnerFarming(), 80);
@@ -561,10 +564,10 @@ TEST(SettlementAgentUnitTest, EqualityOperator_WithPartnerInfo) {
561564
partner_genome.setMtDNA(20);
562565

563566
paxs::SettlementAgent agent1(1, 25, 60, genome, 100, 50, 5);
564-
agent1.marry(2, partner_genome, 80, 20, 8);
567+
agent1.marry(2, partner_genome, 80, 20, 8, 0, 0);
565568

566569
paxs::SettlementAgent agent2(1, 25, 60, genome, 100, 50, 5);
567-
agent2.marry(2, partner_genome, 80, 20, 8);
570+
agent2.marry(2, partner_genome, 80, 20, 8, 0, 0);
568571

569572
// Then: 等価
570573
EXPECT_TRUE(agent1 == agent2);
@@ -574,10 +577,10 @@ TEST(SettlementAgentUnitTest, EqualityOperator_DifferentPartner) {
574577
// Given: 配偶者IDが異なる2つのエージェント
575578
paxs::Genome genome;
576579
paxs::SettlementAgent agent1(1, 25, 60, genome, 100, 50, 5);
577-
agent1.marry(2, paxs::Genome(), 80, 20, 8);
580+
agent1.marry(2 / 3, paxs::Genome(), 80, 20, 8, 0, 0);
578581

579582
paxs::SettlementAgent agent2(1, 25, 60, genome, 100, 50, 5);
580-
agent2.marry(3, paxs::Genome(), 80, 20, 8);
583+
agent2.marry(2 / 3, paxs::Genome(), 80, 20, 8, 0, 0);
581584

582585
// Then: 非等価
583586
EXPECT_FALSE(agent1 == agent2);

Projects/UnitTest/Source/PAX_SAPIENTICA/Simulation/Entity/SettlementUnitTest.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*##########################################################################################
1+
/*##########################################################################################
22
33
PAX SAPIENTICA Library 💀🌿🌏
44
@@ -177,11 +177,11 @@ TEST_F(SettlementUnitTest, Death_DivorcesPartnerWhenAgentDies) {
177177

178178
// 夫(寿命ちょうど、100ステップ)
179179
paxs::SettlementAgent husband(1, 100, 100, male_genome, 100, 0, 5);
180-
husband.marry(2, female_genome, 100, 0, 5);
180+
husband.marry(2, female_genome, 100, 0, 5, 0, 0);
181181

182182
// 妻(若い、30ステップ)
183183
paxs::SettlementAgent wife(2, 30, 100, female_genome, 100, 0, 5);
184-
wife.marry(1, male_genome, 100, 0, 5);
184+
wife.marry(1, male_genome, 100, 0, 5, 0, 0);
185185

186186
settlement.addAgent(husband);
187187
settlement.addAgent(wife);
@@ -215,7 +215,7 @@ TEST_F(SettlementUnitTest, Birth_CreatesChildWhenBirthIntervalReachesZero) {
215215
father_genome.setYDNA(1); // Male
216216

217217
paxs::SettlementAgent mother(1, 25 * 12, 100 * 12, mother_genome, 100, 0, 5);
218-
mother.marry(2, father_genome, 100, 0, 5);
218+
mother.marry(2, father_genome, 100, 0, 5, 0, 0);
219219
mother.setBirthIntervalCount(1); // 次のステップで出産
220220

221221
settlement.addAgent(mother);
@@ -262,7 +262,7 @@ TEST_F(SettlementUnitTest, Birth_ChildInheritsGenomeFromParents) {
262262
father_genome.setYDNA(1);
263263

264264
paxs::SettlementAgent mother(1, 25 * 12, 100 * 12, mother_genome, 100, 0, 5);
265-
mother.marry(2, father_genome, 100, 0, 5);
265+
mother.marry(2, father_genome, 100, 0, 5, 0, 0);
266266
mother.setBirthIntervalCount(1);
267267

268268
settlement.addAgent(mother);
@@ -286,7 +286,7 @@ TEST_F(SettlementUnitTest, Birth_ChildInheritsCultureFromParents) {
286286
father_genome.setYDNA(1);
287287

288288
paxs::SettlementAgent mother(1, 25 * 12, 100 * 12, mother_genome, 100, 0, 5);
289-
mother.marry(2, father_genome, 80, 0, 3);
289+
mother.marry(2, father_genome, 80, 0, 3, 0, 0);
290290
mother.setBirthIntervalCount(1);
291291

292292
settlement.addAgent(mother);
@@ -832,8 +832,8 @@ TEST_F(SettlementUnitTest, Divide_KeepsMarriedCouplesTogether) {
832832
paxs::SettlementAgent husband(i * 2, 25 * 12, 100 * 12, male_genome, 0, 0, 0);
833833
paxs::SettlementAgent wife(i * 2 + 1, 25 * 12, 100 * 12, female_genome, 0, 0, 0);
834834

835-
husband.marry(i * 2 + 1, female_genome, 0, 0, 0);
836-
wife.marry(i * 2, male_genome, 0, 0, 0);
835+
husband.marry(i * 2 + 1, female_genome, 0, 0, 0, 0, 0);
836+
wife.marry(i * 2, male_genome, 0, 0, 0, 0, 0);
837837

838838
settlement.addAgent(husband);
839839
settlement.addAgent(wife);

0 commit comments

Comments
 (0)