From f0d6cefec73492c29d8323e66fb92ee6bbb60cd2 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 26 十二月 2025 18:58:23 +0800
Subject: [PATCH] 优化了预览时候视图居中的逻辑

---
 dikuai.properties                        |    8 
 src/lujing/YixinglujingHaveObstacel.java |  728 ++++++++++++++++++++++++++++---------------------------
 src/zhuye/MapRenderer.java               |   17 +
 set.properties                           |    8 
 src/zhuye/Shouye.java                    |    8 
 user.properties                          |    4 
 Obstacledge.properties                   |    2 
 src/denglu/Denglu.java                   |    2 
 8 files changed, 403 insertions(+), 374 deletions(-)

diff --git a/Obstacledge.properties b/Obstacledge.properties
index c98c415..49a261b 100644
--- a/Obstacledge.properties
+++ b/Obstacledge.properties
@@ -1,5 +1,5 @@
 # 鍓茶崏鏈哄湴鍧楅殰纰嶇墿閰嶇疆鏂囦欢
-# 鐢熸垚鏃堕棿锛�2025-12-26T16:29:19.993693300
+# 鐢熸垚鏃堕棿锛�2025-12-26T18:49:19.310900300
 # 鍧愭爣绯伙細WGS84锛堝害鍒嗘牸寮忥級
 
 # ============ 鍦板潡鍩哄噯绔欓厤缃� ============
diff --git a/dikuai.properties b/dikuai.properties
index edaa106..233f5ee 100644
--- a/dikuai.properties
+++ b/dikuai.properties
@@ -1,5 +1,5 @@
 #Dikuai Properties
-#Fri Dec 26 16:29:20 CST 2025
+#Fri Dec 26 18:49:19 CST 2025
 LAND1.angleThreshold=-1
 LAND1.baseStationCoordinates=3949.89151752,N,11616.79267501,E
 LAND1.boundaryCoordinates=4.30,87.65;-2.36,-65.51;44.25,-66.72;49.70,-14.05;98.13,-15.87;99.34,-69.75;137.48,-67.93;134.45,90.07;4.30,87.65
@@ -17,10 +17,10 @@
 LAND1.mowingSafetyDistance=0.53
 LAND1.mowingTrack=-1
 LAND1.mowingWidth=0.50
-LAND1.obstacleCoordinates=(25.17,9.94;17.74,67.19;113.88,72.00;120.00,19.12;74.99,-4.48)
-LAND1.plannedPath=136.940221,-67.425155;136.061516,-21.604907;135.117045,27.644725;134.257061,72.488826;133.930254,89.530244;111.366178,89.110689;15.660494,87.331145;4.807861,87.129352;3.887608,65.966285;1.769872,17.264734;-0.879464,-43.662043;-1.807069,-64.994176;35.555406,-65.964109;43.773311,-66.177447;48.798326,-17.614591;49.223902,-13.501734;56.146237,-13.761876;98.648661,-15.359117;99.857663,-69.194695;129.523616,-67.779067;136.940221,-67.425155;136.690404,-67.437076;135.810075,-21.532129;134.869489,27.514924;134.007254,72.476328;133.680297,89.525597;133.180383,89.516301;133.507642,72.451332;134.374375,27.255322;135.307191,-21.386574;136.190769,-67.460918;135.691134,-67.484760;134.804308,-21.241018;133.879262,26.995720;133.008029,72.426335;132.680469,89.507006;132.180556,89.497710;132.508416,72.401339;133.384148,26.736118;134.301425,-21.095463;135.191500,-67.508602;134.691865,-67.532444;133.798541,-20.949907;132.889035,26.476516;132.008804,72.376343;131.680642,89.488415;131.180728,89.479120;131.509191,72.351347;132.393921,26.216914;133.295658,-20.804351;134.192230,-67.556286;133.692595,-67.580128;132.792775,-20.658796;131.898808,25.957313;131.009579,72.326351;130.680815,89.469824;130.180901,89.460529;130.509966,72.301354;131.403694,25.697711;132.289892,-20.513240;133.192961,-67.603970;132.693326,-67.627812;131.787008,-20.367685;130.908581,25.438109;130.010354,72.276358;129.680987,89.451234;129.181074,89.441938;129.510741,72.251362;130.413467,25.178507;131.284125,-20.222129;132.193691,-67.651654;131.694057,-67.675496;130.781242,-20.076574;129.918354,24.918905;129.011128,72.226366;128.681160,89.432643;128.181246,89.423348;128.511516,72.201369;129.423240,24.659303;130.278359,-19.931018;131.194422,-67.699338;130.694787,-67.723180;129.775475,-19.785463;128.928127,24.399702;128.011903,72.176373;127.681333,89.414052;127.181419,89.404757;127.512291,72.151377;128.433013,24.140100;129.272592,-19.639907;130.195152,-67.747022;129.695518,-67.770864;128.769709,-19.494352;127.937900,23.880498;127.012678,72.126381;126.681505,89.395462;126.181592,89.386166;126.513066,72.101385;127.442786,23.620896;128.266825,-19.348796;129.130432,-64.381752;129.195883,-67.794706;128.696248,-67.818548;128.531016,-59.202485;127.763942,-19.203241;126.947673,23.361294;126.013453,72.076388;125.681678,89.376871;125.181764,89.367575;125.513840,72.051392;126.452559,23.101693;127.261059,-19.057685;127.931600,-54.023219;128.196614,-67.842390;127.696979,-67.866232;127.332185,-48.843953;126.758176,-18.912129;125.957446,22.842091;125.014228,72.026396;124.681851,89.358280;124.181937,89.348985;124.514615,72.001400;125.462332,22.582489;126.255292,-18.766574;126.732769,-43.664687;127.197344,-67.890074;126.697709,-67.913916;126.133353,-38.485420;125.752409,-18.621018;124.967219,22.322887;124.015003,71.976403;123.682023,89.339689;123.182110,89.330394;123.515390,71.951407;124.472105,22.063285;125.249526,-18.475463;125.533937,-33.306154;126.198075,-67.937758;125.698440,-67.961600;124.934521,-28.126888;124.746642,-18.329907;123.976992,21.803683;123.015778,71.926411;122.682196,89.321099;122.182282,89.311803;122.516165,71.901415;123.481878,21.544082;124.243759,-18.184352;124.335105,-22.947622;125.198805,-67.985442;124.699171,-68.009284;123.740876,-18.038796;123.735690,-17.768356;122.986765,21.284480;122.016552,71.876419;121.682369,89.302508;121.182455,89.293213;121.516940,71.851422;122.491651,21.024878;123.136274,-12.589089;123.237993,-17.893241;124.199536,-68.033126;123.699901,-68.056968;122.735109,-17.747685;122.536858,-7.409823;121.996538,20.765276;121.017327,71.826426;120.682541,89.283917;120.182628,89.274622;120.517715,71.801430;121.501424,20.505674;121.937442,-2.230557;122.232226,-17.602130;123.200267,-68.080811;122.700632,-68.104653;121.729343,-17.456574;121.338026,2.948709;121.006311,20.246072;120.018102,71.776434;119.682714,89.265327;119.182800,89.256031;119.518490,71.751438;120.511197,19.986471;120.738610,8.127976;121.226459,-17.311019;122.200997,-68.128495;121.701362,-68.152337;120.723576,-17.165463;120.139195,13.307242;120.016084,19.726869;119.018877,71.726441;118.682887,89.246736;118.182973,89.237440;118.519264,71.701445;119.520970,19.467267;119.539779,18.486508;120.220693,-17.019907;121.201728,-68.176179;120.702093,-68.200021;119.717810,-16.874352;119.025857,19.207665;118.940363,23.665774;118.019652,71.676449;117.683059,89.228145;117.183145,89.218850;117.520039,71.651453;118.340947,28.845041;118.530743,18.948063;119.214926,-16.728796;120.202458,-68.223863;119.702824,-68.247705;118.712043,-16.583241;118.035630,18.688461;117.741531,34.024307;117.020427,71.626456;116.683232,89.209554;116.183318,89.200259;116.520814,71.601460;117.142115,39.203573;117.540516,18.428860;118.209160,-16.437685;119.203189,-68.271547;118.703554,-68.295389;117.706276,-16.292130;117.045403,18.169258;116.542700,44.382839;116.021202,71.576464;115.683404,89.190964;115.183491,89.181668;115.521589,71.551468;115.943284,49.562106;116.550290,17.909656;117.203393,-16.146574;118.203919,-68.319231;117.704285,-68.343073;116.700510,-16.001019;116.055176,17.650054;115.343868,54.741372;115.021976,71.526472;114.683577,89.172373;114.183663,89.163078;114.522364,71.501475;114.744452,59.920638;115.560063,17.390452;116.197627,-15.855463;117.204650,-68.366915;116.705015,-68.390757;115.694743,-15.709908;115.064949,17.130850;114.145036,65.099904;114.022751,71.476479;113.683750,89.153782;113.183836,89.144487;113.523139,71.451483;113.545620,70.279171;114.569836,16.871249;115.191860,-15.564352;116.205381,-68.414599;115.705746,-68.438441;114.688977,-15.418797;114.074722,16.611647;113.023526,71.426487;112.946204,75.458437;112.683922,89.135191;112.184009,89.125896;112.346789,80.637703;112.523913,71.401490;113.579609,16.352045;114.186093,-15.273241;115.206111,-68.462283;114.706476,-68.486125;113.683210,-15.127685;113.084495,16.092443;112.024301,71.376494;111.747373,85.816969;111.684095,89.116601;111.366178,89.110689;111.184181,89.107305;111.524688,71.351498;112.589382,15.832841;113.180327,-14.982130;114.206842,-68.509967;113.707207,-68.533809;112.677444,-14.836574;112.094268,15.573239;111.025076,71.326502;110.684268,89.098010;110.184354,89.088715;110.525463,71.301506;111.599155,15.313638;112.174560,-14.691019;113.207572,-68.557651;112.707938,-68.581493;111.671677,-14.545463;111.104041,15.054036;110.025851,71.276509;109.684440,89.079419;109.184527,89.070124;109.526238,71.251513;110.608928,14.794434;111.168794,-14.399908;112.208303,-68.605335;111.708668,-68.629177;110.665910,-14.254352;110.113814,14.534832;109.026625,71.226517;108.684613,89.060829;108.184699,89.051533;108.527013,71.201521;109.618701,14.275230;110.163027,-14.108797;111.209034,-68.653019;110.709399,-68.676861;109.660144,-13.963241;109.123587,14.015628;108.027400,71.176524;107.684786,89.042238;107.184872,89.032943;107.527788,71.151528;108.628474,13.756027;109.157261,-13.817686;110.209764,-68.700703;109.710129,-68.724545;108.654377,-13.672130;108.133360,13.496425;107.028175,71.126532;106.684958,89.023647;106.185045,89.014352;106.528563,71.101536;107.638247,13.236823;108.151494,-13.526575;109.210495,-68.748387;108.710860,-68.772229;107.648611,-13.381019;107.143133,12.977221;106.028950,71.076540;105.685131,89.005056;105.185217,88.995761;105.529337,71.051543;106.648020,12.717619;107.145728,-13.235463;108.211225,-68.796072;107.711591,-68.819914;106.642844,-13.089908;106.152906,12.458017;105.029725,71.026547;104.685304,88.986466;104.185390,88.977170;104.530112,71.001551;105.657793,12.198416;106.139961,-12.944352;107.211956,-68.843756;106.712321,-68.867598;105.637078,-12.798797;105.162679,11.938814;104.030500,70.976555;103.685476,88.967875;103.185563,88.958580;103.530887,70.951559;104.667566,11.679212;105.134194,-12.653241;106.212686,-68.891440;105.713052,-68.915282;104.631311,-12.507686;104.172452,11.419610;103.031275,70.926562;102.685649,88.949284;102.185735,88.939989;102.531662,70.901566;103.677339,11.160008;104.128428,-12.362130;105.213417,-68.939124;104.713782,-68.962966;103.625545,-12.216575;103.182225,10.900406;102.032049,70.876570;101.685822,88.930694;101.185908,88.921398;101.532437,70.851574;102.687112,10.640805;103.122661,-12.071019;104.214148,-68.986808;103.714513,-69.010650;102.619778,-11.925464;102.191998,10.381203;101.032824,70.826577;100.685994,88.912103;100.186081,88.902807;100.533212,70.801581;101.696885,10.121601;102.116895,-11.779908;103.214878,-69.034492;102.715243,-69.058334;101.614011,-11.634353;101.201771,9.861999;100.033599,70.776585;99.686167,88.893512;99.186253,88.884217;99.533987,70.751589;100.706658,9.602397;101.111128,-11.488797;102.215609,-69.082176;101.715974,-69.106018;100.608245,-11.343241;100.211544,9.342795;99.034374,70.726593;98.686340,88.874921;98.186426,88.865626;98.534761,70.701596;99.716431,9.083194;100.105362,-11.197686;101.216339,-69.129860;100.716705,-69.153702;99.602478,-11.052130;99.221317,8.823592;98.035149,70.676600;97.686512,88.856331;97.186599,88.847035;97.535536,70.651604;98.726204,8.563990;99.099595,-10.906575;100.217070,-69.177544;98.896710,-26.404472;98.596712,-10.761019;98.231090,8.304388;97.035924,70.626608;96.686685,88.837740;96.186771,88.828445;96.536311,70.601611;97.735977,8.044786;98.093828,-10.615464;98.184464,-15.341673;97.684011,-15.322866;97.590945,-10.469908;97.240863,7.785184;96.036699,70.576615;95.686858,88.819149;95.186944,88.809854;95.537086,70.551619;96.745750,7.525583;97.088062,-10.324353;97.183559,-15.304059;96.683106,-15.285252;96.585179,-10.178797;96.250636,7.265981;95.037473,70.526623;94.687030,88.800559;94.187116,88.791263;94.537861,70.501627;95.755523,7.006379;96.082295,-10.033242;96.182654,-15.266445;95.682201,-15.247638;95.579412,-9.887686;95.260409,6.746777;94.038248,70.476630;93.687203,88.781968;93.187289,88.772672;93.538636,70.451634;94.765296,6.487175;95.076529,-9.742131;95.181748,-15.228831;94.681296,-15.210024;94.573645,-9.596575;94.270182,6.227573;93.039023,70.426638;92.687375,88.763377;92.187462,88.754082;92.539410,70.401642;93.775069,5.967972;94.070762,-9.451019;94.180843,-15.191217;93.680391,-15.172410;93.567879,-9.305464;93.279955,5.708370;92.039798,70.376645;91.687548,88.744786;91.187634,88.735491;91.540185,70.351649;92.784842,5.448768;93.064996,-9.159908;93.179938,-15.153602;92.679485,-15.134795;92.562112,-9.014353;92.289728,5.189166;91.040573,70.326653;90.687721,88.726196;90.187807,88.716900;90.540960,70.301657;91.794615,4.929564;92.059229,-8.868797;92.179033,-15.115988;91.678580,-15.097181;91.556346,-8.723242;91.299501,4.669962;90.041348,70.276661;89.687893,88.707605;89.187980,88.698310;89.541735,70.251664;90.804388,4.410361;91.053462,-8.577686;91.178128,-15.078374;90.677675,-15.059567;90.550579,-8.432131;90.309274,4.150759;89.042122,70.226668;88.688066,88.689014;88.188152,88.679719;88.542510,70.201672;89.814161,3.891157;90.047696,-8.286575;90.177222,-15.040760;89.676770,-15.021953;89.544813,-8.141020;89.319047,3.631555;88.042897,70.176676;87.688239,88.670423;87.188325,88.661128;87.543285,70.151680;88.823934,3.371953;89.041929,-7.995464;89.176317,-15.003146;88.675865,-14.984339;88.539046,-7.849909;88.328820,3.112351;87.043672,70.126683;86.688411,88.651833;86.188498,88.642537;86.544060,70.101687;87.833707,2.852750;88.036163,-7.704353;88.175412,-14.965532;87.674959,-14.946725;87.533279,-7.558797;87.338593,2.593148;86.044447,70.076691;85.688584,88.633242;85.188670,88.623947;85.544834,70.051695;86.843480,2.333546;87.030396,-7.413242;87.174507,-14.927918;86.674054,-14.909111;86.527513,-7.267686;86.348366,2.073944;85.045222,70.026698;84.688757,88.614651;84.188843,88.605356;84.545609,70.001702;85.853253,1.814342;86.024630,-7.122131;86.173602,-14.890304;85.673149,-14.871497;85.521746,-6.976575;85.358139,1.554741;84.045997,69.976706;83.688929,88.596061;83.189016,88.586765;83.546384,69.951710;84.863026,1.295139;85.018863,-6.831020;85.172696,-14.852690;84.672244,-14.833883;84.515980,-6.685464;84.367912,1.035537;83.046772,69.926714;82.689102,88.577470;82.189188,88.568175;82.547159,69.901717;83.872799,0.775935;84.013096,-6.539909;84.171791,-14.815076;83.671339,-14.796269;83.510213,-6.394353;83.377685,0.516333;82.047546,69.876721;81.689275,88.558879;81.189361,88.549584;81.547934,69.851725;82.882572,0.256731;83.007330,-6.248798;83.170886,-14.777462;82.670433,-14.758655;82.504447,-6.103242;82.387459,-0.002870;81.048321,69.826729;80.689447,88.540288;80.189534,88.530993;80.548709,69.801732;81.892345,-0.262472;82.001563,-5.957687;82.169981,-14.739848;81.669528,-14.721041;81.498680,-5.812131;81.397232,-0.522074;80.049096,69.776736;79.689620,88.521698;79.189706,88.512402;79.549484,69.751740;80.902118,-0.781676;80.995797,-5.666575;81.169076,-14.702234;80.668623,-14.683427;80.492914,-5.521020;80.407005,-1.041278;79.049871,69.726744;78.689793,88.503107;78.189879,88.493812;78.550258,69.701748;79.911891,-1.300880;79.990030,-5.375464;80.168170,-14.664620;79.667718,-14.645813;79.487147,-5.229909;79.416778,-1.560481;78.050646,69.676751;77.689965,88.484516;77.190052,88.475221;77.551033,69.651755;78.921664,-1.820083;78.984264,-5.084353;79.167265,-14.627006;78.666813,-14.608199;78.481380,-4.938798;78.426551,-2.079685;77.051421,69.626759;76.690138,88.465926;76.190224,88.456630;76.551808,69.601763;77.931437,-2.339287;77.978497,-4.793242;78.166360,-14.589392;77.665907,-14.570585;77.475614,-4.647687;77.436324,-2.598889;76.052196,69.576766;75.690311,88.447335;75.190397,88.438039;75.552583,69.551770;76.941210,-2.858491;76.972731,-4.502131;77.165455,-14.551778;76.665002,-14.532971;76.469847,-4.356576;76.446097,-3.118092;75.052970,69.526774;74.690483,88.428744;74.190570,88.419449;74.553358,69.501778;75.950983,-3.377694;75.966964,-4.211020;76.164550,-14.514164;75.664097,-14.495357;75.464081,-4.065465;75.455870,-3.637296;74.053745,69.476782;73.690656,88.410153;73.190742,88.400858;73.554133,69.451785;74.960756,-3.896898;74.961197,-3.919909;75.163644,-14.476550;74.663192,-14.457743;74.465643,-4.156500;74.458314,-3.774353;73.054520,69.426789;72.690829,88.391563;72.190915,88.382267;72.554907,69.401793;73.955431,-3.628798;73.970529,-4.416102;74.162739,-14.438936;73.662287,-14.420129;73.475416,-4.675703;73.452548,-3.483242;72.055295,69.376797;71.691001,88.372972;71.191087,88.363677;71.555682,69.351800;72.949664,-3.337687;72.980302,-4.935305;73.161834,-14.401322;72.661381,-14.382515;72.485189,-5.194907;72.446781,-3.192131;71.056070,69.326804;70.691174,88.354381;70.191260,88.345086;70.556457,69.301808;71.943898,-3.046576;71.990075,-5.454509;72.160929,-14.363708;71.660476,-14.344901;71.494962,-5.714111;71.441014,-2.901020;70.056845,69.276812;69.691346,88.335791;69.191433,88.326495;69.557232,69.251816;70.938131,-2.755465;70.999848,-5.973713;71.160024,-14.326094;70.659571,-14.307287;70.504735,-6.233314;70.435248,-2.609909;69.057619,69.226819;68.691519,88.317200;68.191605,88.307904;68.558007,69.201823;69.932365,-2.464354;70.009621,-6.492916;70.159118,-14.288480;69.658666,-14.269673;69.514508,-6.752518;69.429481,-2.318798;68.058394,69.176827;67.691692,88.298609;67.191778,88.289314;67.558782,69.151831;68.926598,-2.173243;69.019394,-7.012120;69.158213,-14.250866;68.657761,-14.232059;68.524281,-7.271722;68.423715,-2.027687;67.059169,69.126835;66.691864,88.280018;66.191951,88.270723;66.559557,69.101838;67.920831,-1.882131;68.029167,-7.531324;68.157308,-14.213252;67.656855,-14.194445;67.534054,-7.790925;67.417948,-1.736576;66.059944,69.076842;65.692037,88.261428;65.192123,88.252132;65.560331,69.051846;66.915065,-1.591020;67.038940,-8.050527;67.156403,-14.175638;66.655950,-14.156831;66.543827,-8.310129;66.412182,-1.445465;65.060719,69.026850;64.692210,88.242837;64.192296,88.233542;64.561106,69.001853;65.909298,-1.299909;66.048713,-8.569731;66.155498,-14.138024;65.655045,-14.119217;65.553600,-8.829333;65.406415,-1.154354;64.061494,68.976857;63.692382,88.224246;63.192469,88.214951;63.561881,68.951861;64.903532,-1.008798;65.058486,-9.088935;65.154592,-14.100410;64.654140,-14.081603;64.563373,-9.348536;64.400648,-0.863243;63.062269,68.926865;62.692555,88.205655;62.192641,88.196360;62.562656,68.901869;63.897765,-0.717687;64.068259,-9.608138;64.153687,-14.062796;63.653235,-14.043989;63.573146,-9.867740;63.394882,-0.572132;62.063043,68.876872;61.692728,88.187065;61.192814,88.177769;61.563431,68.851876;62.891999,-0.426576;63.078032,-10.127342;63.152782,-14.025182;62.652329,-14.006375;62.582919,-10.386944;62.389115,-0.281021;61.063818,68.826880;60.692900,88.168474;60.192987,88.159179;60.564206,68.801884;61.886232,-0.135465;62.087805,-10.646546;62.151877,-13.987568;61.651424,-13.968761;61.592692,-10.906147;61.383349,0.010091;60.064593,68.776887;59.693073,88.149883;59.193159,88.140588;59.564981,68.751891;60.880465,0.155646;61.097578,-11.165749;61.150972,-13.949954;60.650519,-13.931147;60.602465,-11.425351;60.377582,0.301202;59.065368,68.726895;58.693246,88.131293;58.193332,88.121997;58.565755,68.701899;59.874699,0.446757;60.107351,-11.684953;60.150066,-13.912340;59.649614,-13.893532;59.612238,-11.944555;59.371816,0.592313;58.066143,68.676903;57.693418,88.112702;57.193505,88.103407;57.566530,68.651906;58.868932,0.737868;59.117124,-12.204157;59.149161,-13.874725;58.648709,-13.855918;58.622011,-12.463758;58.366049,0.883424;57.066918,68.626910;56.693591,88.094111;56.193677,88.084816;56.567305,68.601914;57.863166,1.028979;58.126897,-12.723360;58.148256,-13.837111;57.647803,-13.818304;57.631784,-12.982962;57.360283,1.174535;56.067693,68.576918;55.693764,88.075520;55.193850,88.066225;55.568080,68.551921;56.857399,1.320090;57.136670,-13.242564;57.147351,-13.799497;56.646898,-13.780690;56.641557,-13.502166;56.354516,1.465646;55.068467,68.526925;54.693936,88.056930;54.194023,88.047634;54.568855,68.501929;55.851633,1.611202;56.146443,-13.761768;56.146446,-13.761883;56.146237,-13.761876;55.645993,-13.743076;55.348749,1.756757;54.069242,68.476933;53.694109,88.038339;53.194195,88.029044;53.569630,68.451937;54.845866,1.902313;55.145540,-13.724269;54.645088,-13.705462;54.342983,2.047868;53.070017,68.426940;52.694282,88.019748;52.194368,88.010453;52.570404,68.401944;53.840100,2.193424;54.144635,-13.686655;53.644183,-13.667848;53.337216,2.338979;52.070792,68.376948;51.694454,88.001158;51.194541,87.991862;51.571179,68.351952;52.834333,2.484535;53.143730,-13.649041;52.643277,-13.630234;52.331450,2.630090;51.071567,68.326956;50.694627,87.982567;50.194713,87.973271;50.571954,68.301959;51.828566,2.775646;52.142825,-13.611427;51.642372,-13.592620;51.325683,2.921201;50.072342,68.276963;49.694800,87.963976;49.194886,87.954681;49.572729,68.251967;50.822800,3.066757;51.141920,-13.573813;50.641467,-13.555006;50.319917,3.212312;49.073116,68.226971;48.694972,87.945385;48.195059,87.936090;48.573504,68.201974;49.817033,3.357868;50.141014,-13.536199;49.640562,-13.517392;49.314150,3.503424;48.073891,68.176978;47.695145,87.926795;47.195231,87.917499;47.574279,68.151982;48.811267,3.648979;49.153262,-14.184416;48.798326,-17.614591;48.731362,-18.261751;48.719741,-17.655795;48.308383,3.794535;47.074666,68.126986;46.695317,87.908204;46.195404,87.898909;46.575054,68.101990;47.805500,3.940090;48.224628,-17.915397;48.309462,-22.339085;47.887562,-26.416420;47.729514,-18.174999;47.302617,4.085646;46.075441,68.076993;45.695490,87.889613;45.195576,87.880318;45.575828,68.051997;46.799734,4.231201;47.234401,-18.434601;47.465662,-30.493755;47.043762,-34.571089;46.739287,-18.694202;46.296850,4.376757;45.076216,68.027001;44.695663,87.871023;44.195749,87.861727;44.576603,68.002005;45.793967,4.522312;46.244174,-18.953804;46.621861,-38.648424;46.199961,-42.725758;45.749060,-19.213406;45.291084,4.667868;44.076991,67.977008;43.695835,87.852432;43.195922,87.843136;43.577378,67.952012;44.788200,4.813423;45.253947,-19.473008;45.778061,-46.803093;45.356161,-50.880428;44.758833,-19.732610;44.285317,4.958979;43.077766,67.927016;42.696008,87.833841;42.196094,87.824546;42.578153,67.902020;43.782434,5.104534;44.263720,-19.992211;44.934261,-54.957762;44.512361,-59.035097;43.768606,-20.251813;43.279551,5.250090;42.078540,67.877024;41.696181,87.815250;41.196267,87.805955;41.578928,67.852027;42.776667,5.395646;43.273493,-20.511415;44.090461,-63.112431;43.649086,-66.174222;42.778379,-20.771017;42.273784,5.541201;41.079315,67.827031;40.696353,87.796660;40.196440,87.787364;40.579703,67.802035;41.770901,5.686757;42.283266,-21.030619;43.148745,-66.161233;42.648404,-66.148244;41.788152,-21.290221;41.268017,5.832312;40.080090,67.777039;39.696526,87.778069;39.196612,87.768774;39.580478,67.752042;40.765134,5.977868;41.293039,-21.549822;42.148063,-66.135255;41.647722,-66.122266;40.797925,-21.809424;40.262251,6.123423;39.080865,67.727046;38.696699,87.759478;38.196785,87.750183;38.581252,67.702050;39.759368,6.268979;40.302812,-22.069026;41.147381,-66.109277;40.647040,-66.096288;39.807698,-22.328628;39.256484,6.414534;38.081640,67.677054;37.696871,87.740887;37.196958,87.731592;37.582027,67.652058;38.753601,6.560090;39.312585,-22.588230;40.146699,-66.083299;39.646358,-66.070310;38.817471,-22.847832;38.250718,6.705645;37.082415,67.627061;36.697044,87.722297;36.197130,87.713001;36.582802,67.602065;37.747834,6.851201;38.322358,-23.107433;39.146017,-66.057322;38.645676,-66.044333;37.827244,-23.367035;37.244951,6.996756;36.083190,67.577069;35.697217,87.703706;35.197303,87.694411;35.583577,67.552073;36.742068,7.142312;37.332131,-23.626637;38.145335,-66.031344;37.644994,-66.018355;36.837017,-23.886239;36.239185,7.287868;35.083964,67.527077;34.697389,87.685115;34.197476,87.675820;34.584352,67.502080;35.736301,7.433423;36.341904,-24.145841;37.144653,-66.005366;36.644312,-65.992377;35.846790,-24.405443;35.233418,7.578979;34.084739,67.477084;33.697562,87.666525;33.197648,87.657229;33.585127,67.452088;34.730535,7.724534;35.351677,-24.665044;36.143971,-65.979388;35.643630,-65.966399;34.856563,-24.924646;34.227651,7.870090;33.085514,67.427092;32.697735,87.647934;32.197821,87.638639;32.585901,67.402095;33.724768,8.015645;34.361450,-25.184248;35.072074,-62.239917;35.143289,-65.953410;34.642948,-65.940421;34.485274,-57.718472;33.866336,-25.443850;33.221885,8.161201;32.086289,67.377099;31.697907,87.629343;31.197994,87.620048;31.586676,67.352103;32.719002,8.306756;33.371223,-25.703452;33.898473,-53.197027;34.142607,-65.927433;33.642266,-65.914444;33.311672,-48.675582;32.876109,-25.963054;32.216118,8.452312;31.087064,67.327107;30.698080,87.610752;30.198166,87.601457;30.587451,67.302111;31.713235,8.597867;32.380996,-26.222655;32.724872,-44.154136;33.141925,-65.901455;32.641584,-65.888466;32.138071,-39.632691;31.885882,-26.482257;31.210352,8.743423;30.087839,67.277114;29.698253,87.592162;29.198339,87.582866;29.588226,67.252118;30.707469,8.888978;31.390769,-26.741859;31.551270,-35.111246;32.141243,-65.875477;31.640902,-65.862488;30.964470,-30.589801;30.895655,-27.001461;30.204585,9.034534;29.088613,67.227122;28.698425,87.573571;28.198512,87.564276;28.589001,67.202126;29.701702,9.180090;30.377669,-26.068356;30.400542,-27.261063;31.140561,-65.849499;30.640219,-65.836510;29.905428,-27.520665;29.790868,-21.546910;29.198819,9.325645;28.089388,67.177129;27.698598,87.554980;27.198684,87.545685;27.589776,67.152133;28.695935,9.471201;29.204068,-17.025465;29.410315,-27.780266;30.139878,-65.823521;29.639537,-65.810532;28.915201,-28.039868;28.617267,-12.504020;28.193052,9.616756;27.090163,67.127137;26.698771,87.536390;26.198857,87.527094;26.590551,67.102141;27.690169,9.762312;28.030466,-7.982575;28.420088,-28.299470;29.139196,-65.797544;28.638855,-65.784555;27.924974,-28.559072;27.443666,-3.461130;27.187286,9.907867;26.090938,67.077145;25.698943,87.517799;25.199030,87.508503;25.591325,67.052148;26.684402,10.053423;26.856865,1.060316;27.429861,-28.818674;28.138514,-65.771566;27.638173,-65.758577;26.934747,-29.078276;26.270064,5.581761;26.181519,10.198978;25.091713,67.027152;24.699116,87.499208;24.199202,87.489913;24.592100,67.002156;25.678636,10.344534;25.683264,10.103206;26.439634,-29.337877;27.137832,-65.745588;26.637491,-65.732599;25.944520,-29.597479;25.175752,10.490089;25.096463,14.624651;24.092488,66.977160;23.699288,87.480617;23.199375,87.471322;23.592875,66.952163;24.509662,19.146096;24.672869,10.635645;25.449407,-29.857081;26.137150,-65.719610;25.636809,-65.706621;24.954293,-30.116683;24.169986,10.781200;23.922862,23.667542;23.093263,66.927167;22.699461,87.462027;22.199547,87.452731;22.593650,66.902171;23.336061,28.188987;23.667103,10.926756;24.459180,-30.376285;25.136468,-65.693632;24.636127,-65.680643;23.964066,-30.635887;23.164219,11.072312;22.749260,32.710432;22.094037,66.877175;21.699634,87.443436;21.199720,87.434141;21.594425,66.852179;22.162460,37.231877;22.661336,11.217867;23.468953,-30.895488;24.135786,-65.667655;23.635445,-65.654666;22.973839,-31.155090;22.158453,11.363423;21.575659,41.753322;21.094812,66.827182;20.699806,87.424845;20.199893,87.415550;20.595200,66.802186;20.988858,46.274768;21.655569,11.508978;22.478726,-31.414692;23.135104,-65.641677;22.634763,-65.628688;21.983612,-31.674294;21.152686,11.654534;20.402058,50.796213;20.095587,66.777190;19.699979,87.406255;19.200065,87.396959;19.595975,66.752194;19.815257,55.317658;20.649803,11.800089;21.488499,-31.933896;22.134422,-65.615699;21.634081,-65.602710;20.993385,-32.193498;20.146920,11.945645;19.228456,59.839103;19.096362,66.727198;18.700152,87.387664;18.200238,87.378368;18.596749,66.702201;18.641656,64.360548;19.644036,12.091200;20.498272,-32.453099;21.133740,-65.589721;20.633399,-65.576732;20.003158,-32.712701;19.141153,12.236756;18.097137,66.677205;18.054855,68.881994;17.700324,87.369073;17.200411,87.359778;17.468054,73.403439;17.597524,66.652209;18.638270,12.382311;19.508045,-32.972303;20.133058,-65.563743;19.632717,-65.550754;19.012931,-33.231905;18.135386,12.527867;17.097912,66.627213;16.881254,77.924884;16.700497,87.350482;16.200583,87.341187;16.294453,82.446329;16.598299,66.602216;17.632503,12.673422;18.517818,-33.491507;19.132376,-65.537766;18.632035,-65.524777;18.022704,-33.751109;17.129620,12.818978;16.098687,66.577220;15.707652,86.967774;15.700670,87.331892;15.660494,87.331145;15.200756,87.322596;15.599074,66.552224;16.626737,12.964534;17.527591,-34.010710;18.131694,-65.511788;17.631353,-65.498799;17.032477,-34.270312;16.123853,13.110089;15.099461,66.527228;14.700842,87.313301;14.200929,87.304006;14.599849,66.502232;15.620970,13.255645;16.537364,-34.529914;17.131012,-65.485810;16.630671,-65.472821;16.042250,-34.789516;15.118087,13.401200;14.100236,66.477235;13.701015,87.294710;13.201101,87.285415;13.600624,66.452239;14.615203,13.546756;15.547137,-35.049118;16.130330,-65.459832;15.629989,-65.446843;15.052023,-35.308720;14.112320,13.692311;13.101011,66.427243;12.701188,87.276119;12.201274,87.266824;12.601398,66.402247;13.609437,13.837867;14.556910,-35.568321;15.129648,-65.433854;14.629307,-65.420865;14.061797,-35.827923;13.106554,13.983422;12.101786,66.377250;11.701360,87.257529;11.201447,87.248233;11.602173,66.352254;12.603670,14.128978;13.566683,-36.087525;14.128966,-65.407877;13.628625,-65.394888;13.071570,-36.347127;12.100787,14.274533;11.102561,66.327258;10.701533,87.238938;10.201619,87.229643;10.602948,66.302262;11.597904,14.420089;12.576456,-36.606729;13.128284,-65.381899;12.627943,-65.368910;12.081343,-36.866331;11.095020,14.565644;10.103336,66.277266;9.701706,87.220347;9.201792,87.211052;9.603723,66.252269;10.592137,14.711200;11.586229,-37.125932;12.127602,-65.355921;11.627261,-65.342932;11.091116,-37.385534;10.089254,14.856756;9.104110,66.227273;8.701878,87.201757;8.201965,87.192461;8.604498,66.202277;9.586371,15.002311;10.596002,-37.645136;11.126920,-65.329943;10.626579,-65.316954;10.100889,-37.904738;9.083487,15.147867;8.104885,66.177281;7.702051,87.183166;7.202137,87.173871;7.605273,66.152284;8.580604,15.293422;9.605775,-38.164340;10.126238,-65.303965;9.625896,-65.290976;9.110662,-38.423942;8.077721,15.438978;7.105660,66.127288;6.702224,87.164575;6.202310,87.155280;6.606048,66.102292;7.574838,15.584533;8.615548,-38.683543;9.125555,-65.277988;8.625214,-65.264999;8.120435,-38.943145;7.071954,15.730089;6.106435,66.077296;5.702396,87.145984;5.202483,87.136689;5.606822,66.052300;6.569071,15.875644;7.625321,-39.202747;8.124873,-65.252010;7.624532,-65.239021;7.130208,-39.462349;6.066188,16.021200;5.107210,66.027303;4.734767,85.448411;4.387726,77.467519;4.607597,66.002307;5.563304,16.166755;6.635094,-39.721951;7.124191,-65.226032;6.623850,-65.213043;6.139981,-39.981553;5.060421,16.312311;4.107985,65.977311;4.040686,69.486626;3.887608,65.966285;3.693645,61.505734;4.557538,16.457866;5.644867,-40.241154;6.123509,-65.200054;5.623168,-65.187065;5.149754,-40.500756;4.054655,16.603422;3.346605,53.524841;2.999564,45.543949;3.551771,16.748978;4.654640,-40.760358;5.122827,-65.174076;4.622486,-65.161087;4.159527,-41.019960;3.048888,16.894533;2.652523,37.563056;2.305483,29.582163;2.546005,17.040089;3.664413,-41.279562;4.122145,-65.148099;3.621804,-65.135110;3.169300,-41.539163;2.043121,17.185644;1.958442,21.601271;1.769872,17.264734;1.611401,13.620378;2.674186,-41.798765;3.121463,-65.122121;2.621122,-65.109132;2.179073,-42.058367;1.264361,5.639486;0.917320,-2.341407;1.683959,-42.317969;2.120781,-65.096143;1.620440,-65.083154;1.188846,-42.577571;0.570279,-10.322299;0.223239,-18.303192;0.693732,-42.837173;1.120099,-65.070165;0.619758,-65.057176;0.198619,-43.096774;-0.123802,-26.284084;-0.470843,-34.264977;-0.296495,-43.356376;0.119417,-65.044187;-0.380924,-65.031198;-0.791608,-43.615978;-0.817883,-42.245869;-0.879464,-43.662043;-1.164924,-50.226762;-0.881265,-65.018210;-1.381606,-65.005221;-1.511964,-58.207655
+LAND1.obstacleCoordinates=25.17,9.94;17.74,67.19;113.88,72.00;120.00,19.12;74.99,-4.48
+LAND1.plannedPath=-1.807069,-64.994176;43.773311,-66.177447;49.223902,-13.501734;98.648661,-15.359117;99.857663,-69.194695;136.940221,-67.425155;133.930254,89.530244;-1.807069,-64.994176;133.937363,89.159526;-1.481732,-65.002621;-0.831059,-65.019513;133.951582,88.418089;133.965800,87.676653;-0.180385,-65.036404;0.470288,-65.053296;133.980019,86.935216;133.994238,86.193779;1.120962,-65.070188;1.771635,-65.087079;134.008456,85.452343;134.022675,84.710906;2.422309,-65.103971;3.072982,-65.120862;134.036894,83.969470;134.051112,83.228033;3.723656,-65.137754;4.374329,-65.154645;49.154019,-14.177100;49.730548,-13.520774;134.065331,82.486596;134.079550,81.745160;50.374792,-13.544985;49.065156,-15.035885;5.025003,-65.171537;5.675676,-65.188428;48.976294,-15.894669;51.019037,-13.569195;134.093768,81.003723;134.107987,80.262286;51.663281,-13.593406;48.887432,-16.753454;6.326350,-65.205320;6.977023,-65.222211;48.798569,-17.612239;52.307525,-13.617617;134.122206,79.520850;134.136425,78.779413;52.951769,-13.641827;48.709707,-18.471024;7.627697,-65.239103;8.278370,-65.255995;48.620845,-19.329809;53.596013,-13.666038;134.150643,78.037977;134.164862,77.296540;54.240258,-13.690249;48.531983,-20.188593;8.929044,-65.272886;9.579717,-65.289778;48.443120,-21.047378;54.884502,-13.714460;134.179081,76.555103;134.193299,75.813667;55.528746,-13.738670;48.354258,-21.906163;10.230391,-65.306669;10.881064,-65.323561;48.265396,-22.764948;56.172990,-13.762881;134.207518,75.072230;134.221737,74.330793;56.817234,-13.787092;48.176533,-23.623733;11.531738,-65.340452;12.182411,-65.357344;48.087671,-24.482518;57.461479,-13.811302;134.235955,73.589357;134.250174,72.847920;58.105723,-13.835513;47.998809,-25.341302;12.833084,-65.374235;13.483758,-65.391127;47.909946,-26.200087;58.749967,-13.859724;134.264393,72.106484;134.278611,71.365047;59.394211,-13.883934;47.821084,-27.058872;14.134431,-65.408018;14.785105,-65.424910;47.732222,-27.917657;60.038455,-13.908145;134.292830,70.623610;134.307049,69.882174;60.682700,-13.932356;47.643360,-28.776442;15.435778,-65.441802;16.086452,-65.458693;47.554497,-29.635226;61.326944,-13.956567;134.321268,69.140737;134.335486,68.399300;61.971188,-13.980777;47.465635,-30.494011;16.737125,-65.475585;17.387799,-65.492476;47.376773,-31.352796;62.615432,-14.004988;134.349705,67.657864;134.363924,66.916427;63.259676,-14.029199;47.287910,-32.211581;18.038472,-65.509368;18.689146,-65.526259;47.199048,-33.070366;63.903921,-14.053409;134.378142,66.174991;134.392361,65.433554;64.548165,-14.077620;47.110186,-33.929151;19.339819,-65.543151;19.990493,-65.560042;47.021323,-34.787935;65.192409,-14.101831;134.406580,64.692117;134.420798,63.950681;65.836653,-14.126042;46.932461,-35.646720;20.641166,-65.576934;21.291840,-65.593825;46.843599,-36.505505;66.480897,-14.150252;134.435017,63.209244;134.449236,62.467807;67.125142,-14.174463;46.754737,-37.364290;21.942513,-65.610717;22.593187,-65.627609;46.665874,-38.223075;67.769386,-14.198674;134.463454,61.726371;134.477673,60.984934;68.413630,-14.222884;46.577012,-39.081859;23.243860,-65.644500;23.894534,-65.661392;46.488150,-39.940644;69.057874,-14.247095;134.491892,60.243498;134.506110,59.502061;69.702118,-14.271306;46.399287,-40.799429;24.545207,-65.678283;25.195881,-65.695175;46.310425,-41.658214;70.346363,-14.295516;134.520329,58.760624;134.534548,58.019188;70.990607,-14.319727;46.221563,-42.516999;25.846554,-65.712066;26.497228,-65.728958;46.132700,-43.375784;71.634851,-14.343938;134.548767,57.277751;134.562985,56.536314;72.279095,-14.368149;46.043838,-44.234568;27.147901,-65.745849;27.798575,-65.762741;45.954976,-45.093353;72.923339,-14.392359;134.577204,55.794878;134.591423,55.053441;73.567584,-14.416570;45.866114,-45.952138;28.449248,-65.779632;29.099922,-65.796524;45.777251,-46.810923;74.211828,-14.440781;134.605641,54.312005;134.619860,53.570568;74.856072,-14.464991;45.688389,-47.669708;29.750595,-65.813416;30.401269,-65.830307;45.599527,-48.528493;75.500316,-14.489202;134.634079,52.829131;134.648297,52.087695;76.144560,-14.513413;45.510664,-49.387277;31.051942,-65.847199;31.702616,-65.864090;45.421802,-50.246062;76.788805,-14.537623;134.662516,51.346258;134.676735,50.604821;77.433049,-14.561834;45.332940,-51.104847;32.353289,-65.880982;33.003963,-65.897873;45.244077,-51.963632;78.077293,-14.586045;134.690953,49.863385;134.705172,49.121948;78.721537,-14.610256;45.155215,-52.822417;33.654636,-65.914765;34.305310,-65.931656;45.066353,-53.681201;79.365781,-14.634466;134.719391,48.380512;134.733610,47.639075;80.010026,-14.658677;44.977491,-54.539986;34.955983,-65.948548;35.606657,-65.965439;44.888628,-55.398771;80.654270,-14.682888;134.747828,46.897638;134.762047,46.156202;81.298514,-14.707098;44.799766,-56.257556;36.257330,-65.982331;36.908004,-65.999223;44.710904,-57.116341;81.942758,-14.731309;134.776266,45.414765;134.790484,44.673329;82.587002,-14.755520;44.622041,-57.975126;37.558677,-66.016114;38.209351,-66.033006;44.533179,-58.833910;83.231247,-14.779731;134.804703,43.931892;134.818922,43.190455;83.875491,-14.803941;44.444317,-59.692695;38.860024,-66.049897;39.510698,-66.066789;44.355455,-60.551480;84.519735,-14.828152;134.833140,42.449019;134.847359,41.707582;85.163979,-14.852363;44.266592,-61.410265;40.161371,-66.083680;40.812045,-66.100572;44.177730,-62.269050;85.808223,-14.876573;134.861578,40.966145;134.875796,40.224709;86.452468,-14.900784;44.088868,-63.127834;41.462718,-66.117463;42.113392,-66.134355;44.000005,-63.986619;87.096712,-14.924995;134.890015,39.483272;134.904234,38.741836;87.740956,-14.949205;43.911143,-64.845404;42.764065,-66.151246;43.414739,-66.168138;43.822281,-65.704189;88.385200,-14.973416;134.918452,38.000399;134.932671,37.258962;89.029444,-14.997627;89.673689,-15.021838;134.946890,36.517526;134.961109,35.776089;90.317933,-15.046048;90.962177,-15.070259;134.975327,35.034652;134.989546,34.293216;91.606421,-15.094470;92.250665,-15.118680;135.003765,33.551779;135.017983,32.810343;92.894909,-15.142891;93.539154,-15.167102;135.032202,32.068906;135.046421,31.327469;94.183398,-15.191313;94.827642,-15.215523;135.060639,30.586033;135.074858,29.844596;95.471886,-15.239734;96.116130,-15.263945;135.089077,29.103159;135.103295,28.361723;96.760375,-15.288155;97.404619,-15.312366;135.117514,27.620286;135.131733,26.878850;98.048863,-15.336577;98.649805,-15.410083;135.145952,26.137413;135.160170,25.395976;98.666395,-16.148820;98.682985,-16.887557;135.174389,24.654540;135.188608,23.913103;98.699575,-17.626294;98.716165,-18.365031;135.202826,23.171666;135.217045,22.430230;98.732755,-19.103768;98.749345,-19.842505;135.231264,21.688793;135.245482,20.947357;98.765935,-20.581242;98.782526,-21.319979;135.259701,20.205920;135.273920,19.464483;98.799116,-22.058716;98.815706,-22.797453;135.288138,18.723047;135.302357,17.981610;98.832296,-23.536190;98.848886,-24.274928;135.316576,17.240173;135.330794,16.498737;98.865476,-25.013665;98.882066,-25.752402;135.345013,15.757300;135.359232,15.015864;98.898656,-26.491139;98.915246,-27.229876;135.373451,14.274427;135.387669,13.532990;98.931836,-27.968613;98.948426,-28.707350;135.401888,12.791554;135.416107,12.050117;98.965016,-29.446087;98.981606,-30.184824;135.430325,11.308680;135.444544,10.567244;98.998196,-30.923561;99.014786,-31.662298;135.458763,9.825807;135.472981,9.084371;99.031376,-32.401035;99.047966,-33.139772;135.487200,8.342934;135.501419,7.601497;99.064556,-33.878509;99.081146,-34.617246;135.515637,6.860061;135.529856,6.118624;99.097736,-35.355983;99.114326,-36.094720;135.544075,5.377187;135.558294,4.635751;99.130917,-36.833457;99.147507,-37.572194;135.572512,3.894314;135.586731,3.152878;99.164097,-38.310932;99.180687,-39.049669;135.600950,2.411441;135.615168,1.670004;99.197277,-39.788406;99.213867,-40.527143;135.629387,0.928568;135.643606,0.187131;99.230457,-41.265880;99.247047,-42.004617;135.657824,-0.554306;135.672043,-1.295742;99.263637,-42.743354;99.280227,-43.482091;135.686262,-2.037179;135.700480,-2.778615;99.296817,-44.220828;99.313407,-44.959565;135.714699,-3.520052;135.728918,-4.261489;99.329997,-45.698302;99.346587,-46.437039;135.743136,-5.002925;135.757355,-5.744362;99.363177,-47.175776;99.379767,-47.914513;135.771574,-6.485799;135.785793,-7.227235;99.396357,-48.653250;99.412947,-49.391987;135.800011,-7.968672;135.814230,-8.710108;99.429537,-50.130724;99.446127,-50.869461;135.828449,-9.451545;135.842667,-10.192982;99.462718,-51.608198;99.479308,-52.346935;135.856886,-10.934418;135.871105,-11.675855;99.495898,-53.085673;99.512488,-53.824410;135.885323,-12.417292;135.899542,-13.158728;99.529078,-54.563147;99.545668,-55.301884;135.913761,-13.900165;135.927979,-14.641601;99.562258,-56.040621;99.578848,-56.779358;135.942198,-15.383038;135.956417,-16.124475;99.595438,-57.518095;99.612028,-58.256832;135.970636,-16.865911;135.984854,-17.607348;99.628618,-58.995569;99.645208,-59.734306;135.999073,-18.348785;136.013292,-19.090221;99.661798,-60.473043;99.678388,-61.211780;136.027510,-19.831658;136.041729,-20.573094;99.694978,-61.950517;99.711568,-62.689254;136.055948,-21.314531;136.070166,-22.055968;99.728158,-63.427991;99.744748,-64.166728;136.084385,-22.797404;136.098604,-23.538841;99.761338,-64.905465;99.777928,-65.644202;136.112822,-24.280278;136.127041,-25.021714;99.794518,-66.382939;99.811109,-67.121676;136.141260,-25.763151;136.155478,-26.504587;99.827699,-67.860414;99.844289,-68.599151;136.169697,-27.246024;136.183916,-27.987461;99.992306,-69.188270;100.686934,-69.155123;136.198135,-28.728897;136.212353,-29.470334;101.381563,-69.121976;102.076191,-69.088829;136.226572,-30.211771;136.240791,-30.953207;102.770819,-69.055682;103.465448,-69.022535;136.255009,-31.694644;136.269228,-32.436080;104.160076,-68.989388;104.854704,-68.956241;136.283447,-33.177517;136.297665,-33.918954;105.549332,-68.923094;106.243961,-68.889947;136.311884,-34.660390;136.326103,-35.401827;106.938589,-68.856800;107.633217,-68.823653;136.340321,-36.143264;136.354540,-36.884700;108.327845,-68.790507;109.022474,-68.757360;136.368759,-37.626137;136.382978,-38.367573;109.717102,-68.724213;110.411730,-68.691066;136.397196,-39.109010;136.411415,-39.850447;111.106359,-68.657919;111.800987,-68.624772;136.425634,-40.591883;136.439852,-41.333320;112.495615,-68.591625;113.190243,-68.558478;136.454071,-42.074757;136.468290,-42.816193;113.884872,-68.525331;114.579500,-68.492184;136.482508,-43.557630;136.496727,-44.299066;115.274128,-68.459037;115.968756,-68.425890;136.510946,-45.040503;136.525164,-45.781940;116.663385,-68.392744;117.358013,-68.359597;136.539383,-46.523376;136.553602,-47.264813;118.052641,-68.326450;118.747270,-68.293303;136.567821,-48.006249;136.582039,-48.747686;119.441898,-68.260156;120.136526,-68.227009;136.596258,-49.489123;136.610477,-50.230559;120.831154,-68.193862;121.525783,-68.160715;136.624695,-50.971996;136.638914,-51.713433;122.220411,-68.127568;122.915039,-68.094421;136.653133,-52.454869;136.667351,-53.196306;123.609667,-68.061274;124.304296,-68.028127;136.681570,-53.937742;136.695789,-54.679179;124.998924,-67.994981;125.693552,-67.961834;136.710007,-55.420616;136.724226,-56.162052;126.388181,-67.928687;127.082809,-67.895540;136.738445,-56.903489;136.752663,-57.644926;127.777437,-67.862393;128.472065,-67.829246;136.766882,-58.386362;136.781101,-59.127799;129.166694,-67.796099;129.861322,-67.762952;136.795320,-59.869235;136.809538,-60.610672;130.555950,-67.729805;131.250578,-67.696658;136.823757,-61.352109;136.837976,-62.093545;131.945207,-67.663511;132.639835,-67.630364;136.852194,-62.834982;136.866413,-63.576419;133.334463,-67.597217;134.029092,-67.564071;136.880632,-64.317855;136.894850,-65.059292;134.723720,-67.530924;135.418348,-67.497777;136.909069,-65.800728;136.923288,-66.542165;136.112976,-67.464630
 LAND1.returnPathCoordinates=-1
 LAND1.returnPathRawCoordinates=-1
 LAND1.returnPointCoordinates=-1
-LAND1.updateTime=2025-12-26 16\:29\:20
+LAND1.updateTime=2025-12-26 18\:49\:19
 LAND1.userId=-1
diff --git a/set.properties b/set.properties
index b53e384..18a7618 100644
--- a/set.properties
+++ b/set.properties
@@ -1,5 +1,5 @@
 #Mower Configuration Properties - Updated
-#Fri Dec 26 17:35:17 CST 2025
+#Fri Dec 26 18:57:41 CST 2025
 appVersion=-1
 boundaryLengthVisible=false
 currentWorkLandNumber=LAND1
@@ -8,12 +8,12 @@
 handheldMarkerId=1872
 idleTrailDurationSeconds=60
 manualBoundaryDrawingMode=false
-mapScale=1.32
+mapScale=2.29
 measurementModeEnabled=false
 mowerId=6258
 serialAutoConnect=true
 serialBaudRate=115200
 serialPortName=COM15
 simCardNumber=-1
-viewCenterX=-71.61
-viewCenterY=-56.92
+viewCenterX=-67.56
+viewCenterY=-10.16
diff --git a/src/denglu/Denglu.java b/src/denglu/Denglu.java
index 469f0b5..4a756c3 100644
--- a/src/denglu/Denglu.java
+++ b/src/denglu/Denglu.java
@@ -619,7 +619,7 @@
             // 璁剧疆涓庣櫥褰曢〉闈㈢浉鍚岀殑灏哄
             mainFrame.setSize(UIConfig.DIALOG_WIDTH, UIConfig.DIALOG_HEIGHT);
             mainFrame.setMinimumSize(new Dimension(UIConfig.DIALOG_WIDTH, UIConfig.DIALOG_HEIGHT));
-            mainFrame.setResizable(false);
+            mainFrame.setResizable(true);
             mainFrame.setLocationRelativeTo(null);
             mainFrame.setVisible(true);
 
diff --git a/src/lujing/YixinglujingHaveObstacel.java b/src/lujing/YixinglujingHaveObstacel.java
index c864d3a..d9dceb3 100644
--- a/src/lujing/YixinglujingHaveObstacel.java
+++ b/src/lujing/YixinglujingHaveObstacel.java
@@ -1,394 +1,194 @@
 package lujing;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
+import java.util.regex.*;
 
 /**
- * 寮傚舰鑽夊湴璺緞瑙勫垝 - 闅滅鐗╄鍓紭鍖栫増 V9.0
- * 鏍稿績閫昏緫锛氬厛鐢熸垚鍏ㄨ鐩栨壂鎻忚矾寰勶紝鍐嶅埄鐢ㄥ鎵╁悗鐨勯殰纰嶇墿瀵硅矾寰勮繘琛岃鍓��
+ * 寮傚舰鑽夊湴璺緞瑙勫垝 - 鍑瑰杈瑰舰淇鐗� V12.0
+ * 淇敼璇存槑锛�
+ * 1. 鎸夌収鐢ㄦ埛瑕佹眰锛屽厛鐢熸垚鏃犻殰纰嶇墿鐨勫畬鏁磋矾寰勶紙鍥磋竟+鎵弿+杩炴帴锛夈��
+ * 2. 瀵瑰畬鏁磋矾寰勮繘琛岄殰纰嶇墿瑁佸壀銆�
+ * 3. 瀵硅鍓骇鐢熺殑鏂偣锛屽皾璇曟部闅滅鐗╄竟鐣岃繘琛岃繛鎺ャ��
  */
 public class YixinglujingHaveObstacel {
 
-    /**
-     * 瑙勫垝璺緞涓诲叆鍙�
-     */
+    private static final double EPS = 1e-8;
+    private static final double MIN_SEG_LEN = 0.02; // 蹇界暐灏忎簬2cm鐨勭绾�
+
     public static List<PathSegment> planPath(String coordinates, String obstaclesStr, String widthStr, String marginStr) {
-        // 1. 瑙f瀽鍙傛暟
         List<Point> rawPoints = parseCoordinates(coordinates);
         if (rawPoints.size() < 3) return new ArrayList<>();
 
         double mowWidth = Double.parseDouble(widthStr);
         double safeMargin = Double.parseDouble(marginStr);
 
-        // 2. 棰勫鐞嗗湴鍧楄竟鐣� (纭繚閫嗘椂閽�)
-        ensureCounterClockwise(rawPoints);
+        // 1. 缁熶竴澶氳竟褰㈡柟鍚戜负閫嗘椂閽� (CCW)
+        ensureCCW(rawPoints);
         
-        // 3. 鐢熸垚鍦板潡鍐呯缉鐨勫畨鍏ㄤ綔涓氳竟鐣� (Inset)
-        List<Point> mowingBoundary = getOffsetPolygon(rawPoints, safeMargin); // 姝f暟鍐呯缉
+        // 2. 鐢熸垚浣滀笟鍐呯缉杈圭晫
+        List<Point> mowingBoundary = getOffsetPolygon(rawPoints, safeMargin);
         if (mowingBoundary.size() < 3) return new ArrayList<>();
 
-        // 4. 绗竴姝ワ細鐢熸垚鈥滄棤瑙嗛殰纰嶇墿鈥濈殑鍏ㄨ鐩栨壂鎻忚矾寰�
-        // 鐩存帴浣跨敤鎵弿绾跨畻娉曠敓鎴愬~婊℃暣涓唴缂╄竟鐣岀殑璺緞
-        List<PathSegment> rawPath = generateFullCoveragePath(mowingBoundary, mowWidth);
-
-        // 5. 瑙f瀽闅滅鐗╁苟杩涜澶栨墿 (Outset)
-        // 娉ㄦ剰锛氶殰纰嶇墿澶栨墿璺濈 = 鍓茶崏鏈哄畨鍏ㄨ竟璺濓紝纭繚涓嶅彂鐢熺鎾�
+        // 3. 瑙f瀽骞跺鎵╅殰纰嶇墿
         List<Obstacle> obstacles = parseObstacles(obstaclesStr, safeMargin);
 
-        // 6. 绗簩姝ワ細浣跨敤闅滅鐗╄鍓矾寰� (鏍稿績姝ラ)
-        return clipPathWithObstacles(rawPath, obstacles);
+        // 4. 鐢熸垚鍏ㄨ鐩栬矾寰勶紙涓嶈�冭檻闅滅鐗╋級
+        List<PathSegment> fullPath = generateFullPath(mowingBoundary, mowWidth);
+
+        // 5. 瑁佸壀骞惰繛鎺�
+        return processObstacles(fullPath, obstacles);
     }
 
     /**
-     * 浣跨敤闅滅鐗╅泦鍚堣鍓師濮嬭矾寰�
+     * 鐢熸垚鍏ㄨ鐩栬矾寰勶紙鍥磋竟 + 鎵弿 + 杩炴帴锛夛紝涓嶈�冭檻闅滅鐗�
      */
-    private static List<PathSegment> clipPathWithObstacles(List<PathSegment> rawPath, List<Obstacle> obstacles) {
-        List<PathSegment> finalPath = new ArrayList<>();
-        Point currentPos = (rawPath.isEmpty()) ? new Point(0,0) : rawPath.get(0).start;
-
-        for (PathSegment segment : rawPath) {
-            // 灏嗗綋鍓嶈繖涓�娈佃矾寰勶紝鎷垮幓璺熸墍鏈夐殰纰嶇墿杩涜纰版挒妫�娴嬪拰瑁佸壀
-            // 鍒濆鏃讹紝杩欎竴娈垫槸瀹屾暣鐨�
-            List<PathSegment> segmentsToProcess = new ArrayList<>();
-            segmentsToProcess.add(segment);
-
-            for (Obstacle obs : obstacles) {
-                List<PathSegment> nextIterSegments = new ArrayList<>();
-                for (PathSegment seg : segmentsToProcess) {
-                    // 濡傛灉鏄壊鑽夎矾寰勶紝闇�瑕佽鍓紱濡傛灉鏄┖璧拌矾寰勶紝閫氬父涔熼渶瑕侀伩闅滐紝
-                    // 浣嗚繖閲屼富瑕佸鐞嗘壂鎻忕嚎鐨勮鍓��
-                    if (seg.isMowing) {
-                        nextIterSegments.addAll(obs.clip(seg));
-                    } else {
-                        // 绌鸿蛋璺緞鏆傛椂淇濈暀锛堥珮绾ч伩闅滈渶瑕丄*绠楁硶锛屾澶勭畝鍖栦负淇濈暀锛�
-                        nextIterSegments.add(seg);
-                    }
-                }
-                segmentsToProcess = nextIterSegments;
-            }
-
-            // 灏嗚鍓悗鍓╀綑鐨勭嚎娈靛姞鍏ユ渶缁堣矾寰�
-            for (PathSegment s : segmentsToProcess) {
-                // 杩囨护鎺夊洜涓鸿鍓骇鐢熺殑鏋佺煭绾挎
-                if (distance(s.start, s.end) < 0.05) continue;
-
-                // 濡傛灉褰撳墠鐐瑰拰绾挎璧风偣涓嶈繛璐紝鍔犲叆杩炴帴璺緞锛堢┖璧帮級
-                if (distance(currentPos, s.start) > 0.05) {
-                    finalPath.add(new PathSegment(currentPos, s.start, false));
-                }
-                
-                finalPath.add(s);
-                currentPos = s.end;
-            }
-        }
-        return finalPath;
-    }
-
-    // --- 璺緞鐢熸垚鏍稿績绠楁硶 (绉绘鑷� NoObstacle 绫�) ---
-
-    private static List<PathSegment> generateFullCoveragePath(List<Point> boundary, double width) {
-        // 1. 瀵绘壘鏈�浼樿搴�
-        double angle = findOptimalAngle(boundary);
+    private static List<PathSegment> generateFullPath(List<Point> boundary, double width) {
+        List<PathSegment> path = new ArrayList<>();
         
-        // 2. 鏃嬭浆澶氳竟褰互瀵归綈鍧愭爣杞�
-        List<Point> rotatedPoly = new ArrayList<>();
-        for (Point p : boundary) rotatedPoly.add(rotatePoint(p, -angle));
-
-        double minY = Double.MAX_VALUE, maxY = -Double.MAX_VALUE;
-        for (Point p : rotatedPoly) {
-            minY = Math.min(minY, p.y);
-            maxY = Math.max(maxY, p.y);
+        // A. 鍥磋竟璺緞锛堥鍦堬級
+        for (int i = 0; i < boundary.size(); i++) {
+            path.add(new PathSegment(boundary.get(i), boundary.get((i + 1) % boundary.size()), true));
         }
 
-        // 3. 鐢熸垚鎵弿绾�
-        List<PathSegment> segments = new ArrayList<>();
+        // B. 鎵弿璺緞鐢熸垚
+        double angle = findOptimalAngle(boundary);
+        List<Point> rotPoly = rotatePoints(boundary, -angle);
+        
+        double minY = Double.MAX_VALUE, maxY = -Double.MAX_VALUE;
+        for (Point p : rotPoly) { minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y); }
+
         boolean l2r = true;
-        // 鍥磋竟璺緞鍏堢敓鎴�
-        Point scanStartPoint = null;
-
-        // 杩欓噷鎴戜滑鍏堣绠楁壂鎻忕嚎锛屾渶鍚庡啀鍐冲畾鍥磋竟璧风偣浠ュ噺灏戠┖璧�
-        List<List<PathSegment>> scanRows = new ArrayList<>();
-
-        for (double y = minY + width/2; y <= maxY - width/2; y += width) {
-            List<Double> xInters = getXIntersections(rotatedPoly, y);
+        List<PathSegment> scanSegments = new ArrayList<>();
+        for (double y = minY + width / 2; y <= maxY - width / 2; y += width) {
+            List<Double> xInters = getXIntersections(rotPoly, y);
             if (xInters.size() < 2) continue;
             Collections.sort(xInters);
 
             List<PathSegment> row = new ArrayList<>();
-            // 涓や袱閰嶅褰㈡垚绾挎
+            // 鍑瑰杈瑰舰鏍稿績锛氭垚瀵瑰彇鍑轰氦鐐癸紝璺宠繃涓棿鐨勭┖娲�
             for (int i = 0; i < xInters.size() - 1; i += 2) {
                 Point s = rotatePoint(new Point(xInters.get(i), y), angle);
                 Point e = rotatePoint(new Point(xInters.get(i + 1), y), angle);
                 row.add(new PathSegment(s, e, true));
             }
 
-            // 铔囧舰鎺掑簭
             if (!l2r) {
                 Collections.reverse(row);
-                for (PathSegment s : row) {
-                    Point tmp = s.start; s.start = s.end; s.end = tmp;
-                }
+                for (PathSegment s : row) { Point t = s.start; s.start = s.end; s.end = t; }
             }
-            scanRows.add(row);
-            if (scanStartPoint == null && !row.isEmpty()) scanStartPoint = row.get(0).start;
+            scanSegments.addAll(row);
             l2r = !l2r;
         }
 
-        // 4. 鐢熸垚鍥磋竟璺緞 (瀵归綈鍒扮涓�涓壂鎻忕偣)
-        List<Point> alignedBoundary = alignBoundaryStart(boundary, scanStartPoint);
-        for (int i = 0; i < alignedBoundary.size(); i++) {
-            segments.add(new PathSegment(alignedBoundary.get(i), alignedBoundary.get((i+1)%alignedBoundary.size()), true));
-        }
-
-        // 5. 鍔犲叆鎵弿璺緞
-        for (List<PathSegment> row : scanRows) {
-            segments.addAll(row);
-        }
-
-        return segments;
-    }
-
-    // --- 闅滅鐗╁鐞嗙被 ---
-
-    private static List<Obstacle> parseObstacles(String obsStr, double margin) {
-        List<Obstacle> list = new ArrayList<>();
-        if (obsStr == null || obsStr.trim().isEmpty()) return list;
-
-        // 澶勭悊鏍煎紡 (x,y;...)(x,y;...) 鎴� $ 鍒嗛殧
-        String cleanStr = obsStr.replaceAll("\\s+", "");
-        String[] parts;
-        if (cleanStr.contains("(") && cleanStr.contains(")")) {
-            List<String> matches = new ArrayList<>();
-            java.util.regex.Matcher m = java.util.regex.Pattern.compile("\\(([^)]+)\\)").matcher(cleanStr);
-            while (m.find()) matches.add(m.group(1));
-            parts = matches.toArray(new String[0]);
-        } else {
-            parts = cleanStr.split("\\$");
-        }
-
-        for (String pStr : parts) {
-            List<Point> pts = parseCoordinates(pStr);
-            if (pts.isEmpty()) continue;
-            
-            if (pts.size() == 2) {
-                // 鍦嗗舰闅滅鐗�
-                double r = distance(pts.get(0), pts.get(1));
-                list.add(new CircleObstacle(pts.get(0), r + margin)); // 鍗婂緞澧炲姞margin
-            } else {
-                // 澶氳竟褰㈤殰纰嶇墿
-                ensureCounterClockwise(pts);
-                // 澶栨墿闅滅鐗� (Offset Out)
-                // 娉ㄦ剰锛氬湪閫氱敤鍋忕Щ绠楁硶涓紝閫嗘椂閽堝杈瑰舰锛岃礋鏁伴�氬父琛ㄧず澶栨墿锛屾垨鑰呬娇鐢ㄧ壒瀹氱畻娉�
-                // 杩欓噷鎴戜滑澶嶇敤 getOffsetPolygon锛屽苟浼犲叆璐熺殑margin鏉ュ疄鐜板鎵�
-                // *浣嗗湪鏈被鐩墠鐨� getOffsetPolygon 瀹炵幇涓紙鍩轰簬瑙掑钩鍒嗙嚎锛夛紝濡傛灉鏄�嗘椂閽堬細
-                // 姝f暟鏄悜宸︼紙鍐呯缉锛夛紝璐熸暟鏄悜鍙筹紙澶栨墿锛�*
-                List<Point> expanded = getOffsetPolygon(pts, -margin); 
-                list.add(new PolyObstacle(expanded));
-            }
-        }
-        return list;
-    }
-
-    abstract static class Obstacle {
-        // 杩斿洖瑁佸壀鍚庣殑绾挎鍒楄〃锛堝嵆淇濈暀鍦ㄩ殰纰嶇墿澶栭儴鐨勭嚎娈碉級
-        abstract List<PathSegment> clip(PathSegment seg);
-    }
-
-    static class CircleObstacle extends Obstacle {
-        Point c; double r;
-        CircleObstacle(Point c, double r) { this.c = c; this.r = r; }
-        
-        @Override
-        List<PathSegment> clip(PathSegment seg) {
-            // 璁$畻鐩寸嚎涓庡渾鐨勪氦鐐� t鍊� (0..1)
-            double dx = seg.end.x - seg.start.x;
-            double dy = seg.end.y - seg.start.y;
-            double fx = seg.start.x - c.x;
-            double fy = seg.start.y - c.y;
-            
-            double A = dx*dx + dy*dy;
-            double B = 2*(fx*dx + fy*dy);
-            double C = (fx*fx + fy*fy) - r*r;
-            double delta = B*B - 4*A*C;
-
-            List<PathSegment> result = new ArrayList<>();
-            if (delta < 0) {
-                // 鏃犱氦鐐癸紝鍏ㄤ繚鐣欐垨鍏ㄥ墧闄�
-                if (!isInside(seg.start)) result.add(seg);
-                return result;
-            }
-
-            double t1 = (-B - Math.sqrt(delta)) / (2*A);
-            double t2 = (-B + Math.sqrt(delta)) / (2*A);
-            
-            List<Double> ts = new ArrayList<>();
-            ts.add(0.0);
-            if (t1 > 0 && t1 < 1) ts.add(t1);
-            if (t2 > 0 && t2 < 1) ts.add(t2);
-            ts.add(1.0);
-            Collections.sort(ts);
-
-            for (int i = 0; i < ts.size()-1; i++) {
-                double midT = (ts.get(i) + ts.get(i+1)) / 2;
-                Point mid = interpolate(seg.start, seg.end, midT);
-                if (!isInside(mid)) {
-                    result.add(new PathSegment(interpolate(seg.start, seg.end, ts.get(i)),
-                                               interpolate(seg.start, seg.end, ts.get(i+1)), 
-                                               seg.isMowing));
+        // C. 杩炴帴鎵弿绾�
+        if (!scanSegments.isEmpty()) {
+            Point currentPos = path.isEmpty() ? scanSegments.get(0).start : path.get(path.size() - 1).end;
+            for (PathSegment seg : scanSegments) {
+                if (distance(currentPos, seg.start) > MIN_SEG_LEN) {
+                    path.add(new PathSegment(currentPos, seg.start, false));
                 }
+                path.add(seg);
+                currentPos = seg.end;
             }
-            return result;
         }
 
-        boolean isInside(Point p) {
-            return (p.x-c.x)*(p.x-c.x) + (p.y-c.y)*(p.y-c.y) < r*r;
-        }
+        return path;
     }
 
-    static class PolyObstacle extends Obstacle {
-        List<Point> points;
-        double minX, maxX, minY, maxY;
+    /**
+     * 澶勭悊闅滅鐗╋細瑁佸壀璺緞骞剁敓鎴愮粫琛岃繛鎺�
+     */
+    private static List<PathSegment> processObstacles(List<PathSegment> fullPath, List<Obstacle> obstacles) {
+        List<PathSegment> result = new ArrayList<>();
+        if (fullPath.isEmpty()) return result;
 
-        PolyObstacle(List<Point> pts) {
-            this.points = pts;
-            updateBounds();
-        }
+        Point currentPos = fullPath.get(0).start;
 
-        void updateBounds() {
-            minX = minY = Double.MAX_VALUE;
-            maxX = maxY = -Double.MAX_VALUE;
-            for (Point p : points) {
-                minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);
-                minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);
-            }
-        }
-
-        boolean isInside(Point p) {
-            if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) return false;
-            boolean result = false;
-            for (int i = 0, j = points.size() - 1; i < points.size(); j = i++) {
-                if ((points.get(i).y > p.y) != (points.get(j).y > p.y) &&
-                    (p.x < (points.get(j).x - points.get(i).x) * (p.y - points.get(i).y) / (points.get(j).y - points.get(i).y) + points.get(i).x)) {
-                    result = !result;
-                }
-            }
-            return result;
-        }
-
-        @Override
-        List<PathSegment> clip(PathSegment seg) {
-            List<Double> ts = new ArrayList<>();
-            ts.add(0.0);
-            ts.add(1.0);
-
-            // 璁$畻绾挎涓庨殰纰嶇墿姣忎竴鏉¤竟鐨勪氦鐐�
-            for (int i = 0; i < points.size(); i++) {
-                Point p1 = points.get(i);
-                Point p2 = points.get((i+1)%points.size());
-                double t = getIntersectionT(seg.start, seg.end, p1, p2);
-                if (t > 1e-6 && t < 1 - 1e-6) {
-                    ts.add(t);
-                }
-            }
-            Collections.sort(ts);
-
-            List<PathSegment> result = new ArrayList<>();
-            // 妫�鏌ユ瘡涓�灏忔鐨勪腑鐐规槸鍚﹀湪闅滅鐗╁唴
-            for (int i = 0; i < ts.size() - 1; i++) {
-                double tMid = (ts.get(i) + ts.get(i+1)) / 2.0;
-                // 濡傛灉涓ょ偣鏋佸叾鎺ヨ繎锛岃烦杩�
-                if (ts.get(i+1) - ts.get(i) < 1e-6) continue;
-                
-                Point mid = interpolate(seg.start, seg.end, tMid);
-                if (!isInside(mid)) {
-                    // 鍦ㄥ閮紝淇濈暀
-                    Point s = interpolate(seg.start, seg.end, ts.get(i));
-                    Point e = interpolate(seg.start, seg.end, ts.get(i+1));
-                    result.add(new PathSegment(s, e, seg.isMowing));
-                }
-            }
-            return result;
-        }
-    }
-
-    // --- 閫氱敤鍑犱綍绠楁硶 ---
-
-    private static List<Point> getOffsetPolygon(List<Point> points, double offset) {
-        List<Point> result = new ArrayList<>();
-        int n = points.size();
-        for (int i = 0; i < n; i++) {
-            Point p1 = points.get((i - 1 + n) % n);
-            Point p2 = points.get(i);
-            Point p3 = points.get((i + 1) % n);
+        for (PathSegment seg : fullPath) {
+            // 瑁佸壀鍗曟潯绾挎
+            List<PathSegment> pieces = clipSegment(seg, obstacles);
             
-            // 鍚戦噺 p1->p2 鍜� p2->p3
-            double v1x = p2.x - p1.x, v1y = p2.y - p1.y;
-            double v2x = p3.x - p2.x, v2y = p3.y - p2.y;
-            double l1 = Math.hypot(v1x, v1y), l2 = Math.hypot(v2x, v2y);
-            
-            if (l1 < 1e-5 || l2 < 1e-5) continue;
-
-            // 娉曞悜閲� (鍚戝乏杞�90搴�: -y, x)
-            double n1x = -v1y / l1, n1y = v1x / l1;
-            double n2x = -v2y / l2, n2y = v2x / l2;
-
-            // 瑙掑钩鍒嗙嚎
-            double bx = n1x + n2x, by = n1y + n2y;
-            double bl = Math.hypot(bx, by);
-            if (bl < 1e-5) { bx = n1x; by = n1y; } 
-            else { bx /= bl; by /= bl; }
-
-            // 淇闀垮害 offset / sin(theta/2) = offset / dot(n1, b)
-            double dot = n1x * bx + n1y * by;
-            double dist = offset / Math.max(Math.abs(dot), 0.1); // 闃叉灏栬杩囬暱
-            
-            // 闃堝�奸檺鍒讹紝闃叉鑷氦鎴栫暩鍙樿繃澶�
-            dist = Math.signum(offset) * Math.min(Math.abs(dist), Math.abs(offset) * 3);
-
-            result.add(new Point(p2.x + bx * dist, p2.y + by * dist));
+            for (PathSegment piece : pieces) {
+                // 濡傛灉鏈夋柇鐐癸紝灏濊瘯杩炴帴
+                if (distance(currentPos, piece.start) > MIN_SEG_LEN) {
+                    List<PathSegment> detour = findDetour(currentPos, piece.start, obstacles);
+                    result.addAll(detour);
+                }
+                result.add(piece);
+                currentPos = piece.end;
+            }
         }
         return result;
     }
 
-    private static double findOptimalAngle(List<Point> poly) {
-        double bestA = 0, minH = Double.MAX_VALUE;
-        for (int i = 0; i < poly.size(); i++) {
-            Point p1 = poly.get(i), p2 = poly.get((i + 1) % poly.size());
-            double a = Math.atan2(p2.y - p1.y, p2.x - p1.x);
-            double h = calcHeight(poly, a);
-            if (h < minH) { minH = h; bestA = a; }
+    private static List<PathSegment> findDetour(Point p1, Point p2, List<Obstacle> obstacles) {
+        // 妫�鏌ユ柇鐐规槸鍚﹀湪鍚屼竴涓殰纰嶇墿涓�
+        for (Obstacle obs : obstacles) {
+            if (obs.isOnBoundary(p1) && obs.isOnBoundary(p2)) {
+                return obs.getBoundaryPath(p1, p2);
+            }
         }
-        return bestA;
+        // 濡傛灉涓嶅湪鍚屼竴涓殰纰嶇墿涓婏紙鐞嗚涓婅緝灏戣锛岄櫎闈炶法瓒婁簡澶氫釜闅滅鐗╋級锛岀洿鎺ヨ繛鎺�
+        List<PathSegment> res = new ArrayList<>();
+        res.add(new PathSegment(p1, p2, false));
+        return res;
     }
 
-    private static double calcHeight(List<Point> poly, double ang) {
-        double min = Double.MAX_VALUE, max = -Double.MAX_VALUE;
-        for (Point p : poly) {
-            Point r = rotatePoint(p, -ang);
-            min = Math.min(min, r.y); max = Math.max(max, r.y);
+    private static List<PathSegment> clipSegment(PathSegment seg, List<Obstacle> obstacles) {
+        List<PathSegment> result = new ArrayList<>();
+        result.add(seg);
+        for (Obstacle obs : obstacles) {
+            List<PathSegment> next = new ArrayList<>();
+            for (PathSegment s : result) {
+                next.addAll(obs.clip(s));
+            }
+            result = next;
         }
-        return max - min;
+        return result;
     }
 
-    private static double getIntersectionT(Point a, Point b, Point c, Point d) {
-        double ux = b.x - a.x, uy = b.y - a.y;
-        double vx = d.x - c.x, vy = d.y - c.y;
-        double det = vx * uy - vy * ux;
-        if (Math.abs(det) < 1e-8) return -1;
-        
-        double wx = c.x - a.x, wy = c.y - a.y;
-        double t = (vx * wy - vy * wx) / det;
-        double u = (ux * wy - uy * wx) / det;
-        
-        if (u >= 0 && u <= 1) return t; // 鍙繚璇佷氦鐐瑰湪绾挎CD涓婏紝t鏄疉B涓婄殑姣斾緥
-        return -1;
+    // --- 鍑犱綍淇绠楁硶 ---
+
+    /**
+     * 淇鍚庣殑鏂瑰悜鍒ゅ畾锛氶瀷甯﹀叕寮� Sum (x2-x1)(y2+y1)
+     * 鍦ㄦ爣鍑嗙瑳鍗″皵鍧愭爣绯讳腑锛孲um < 0 涓洪�嗘椂閽�
+     */
+    private static void ensureCCW(List<Point> pts) {
+        double s = 0;
+        for (int i = 0; i < pts.size(); i++) {
+            Point p1 = pts.get(i), p2 = pts.get((i + 1) % pts.size());
+            s += (p2.x - p1.x) * (p2.y + p1.y);
+        }
+        if (s > 0) Collections.reverse(pts); 
+    }
+
+    private static List<Point> getOffsetPolygon(List<Point> pts, double offset) {
+        List<Point> result = new ArrayList<>();
+        int n = pts.size();
+        for (int i = 0; i < n; i++) {
+            Point p1 = pts.get((i - 1 + n) % n), p2 = pts.get(i), p3 = pts.get((i + 1) % n);
+            double v1x = p2.x - p1.x, v1y = p2.y - p1.y;
+            double v2x = p3.x - p2.x, v2y = p3.y - p2.y;
+            double l1 = Math.hypot(v1x, v1y), l2 = Math.hypot(v2x, v2y);
+            if (l1 < EPS || l2 < EPS) continue;
+
+            // 娉曞悜閲忓亸绉伙紙閫嗘椂閽堝悜宸﹀亸绉诲嵆涓哄唴缂╋級
+            double n1x = -v1y / l1, n1y = v1x / l1;
+            double n2x = -v2y / l2, n2y = v2x / l2;
+            double bx = n1x + n2x, by = n1y + n2y;
+            double bl = Math.hypot(bx, by);
+            if (bl < EPS) { bx = n1x; by = n1y; } else { bx /= bl; by /= bl; }
+            double dist = offset / Math.max(Math.abs(n1x * bx + n1y * by), 0.1);
+            result.add(new Point(p2.x + bx * dist, p2.y + by * dist));
+        }
+        return result;
     }
 
     private static List<Double> getXIntersections(List<Point> poly, double y) {
         List<Double> res = new ArrayList<>();
         for (int i = 0; i < poly.size(); i++) {
             Point p1 = poly.get(i), p2 = poly.get((i + 1) % poly.size());
+            // 鏍囧噯鐩镐氦鍒ゆ柇锛氫竴寮�涓�闂伩鍏嶉噸澶嶈绠楅《鐐�
             if ((p1.y <= y && p2.y > y) || (p2.y <= y && p1.y > y)) {
                 res.add(p1.x + (y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y));
             }
@@ -396,63 +196,269 @@
         return res;
     }
 
-    private static List<Point> alignBoundaryStart(List<Point> poly, Point target) {
-        if (target == null) return poly;
-        int idx = 0; double minD = Double.MAX_VALUE;
-        for (int i = 0; i < poly.size(); i++) {
-            double d = distance(poly.get(i), target);
-            if (d < minD) { minD = d; idx = i; }
-        }
-        List<Point> res = new ArrayList<>();
-        for (int i = 0; i < poly.size(); i++) res.add(poly.get((idx + i) % poly.size()));
-        return res;
+    // --- 闅滅鐗╂ā鍨� ---
+
+    abstract static class Obstacle {
+        abstract List<PathSegment> clip(PathSegment seg);
+        abstract boolean isInside(Point p);
+        abstract boolean isOnBoundary(Point p);
+        abstract List<PathSegment> getBoundaryPath(Point p1, Point p2);
     }
 
-    private static void ensureCounterClockwise(List<Point> pts) {
-        double s = 0;
-        for (int i = 0; i < pts.size(); i++) {
-            Point p1 = pts.get(i), p2 = pts.get((i + 1) % pts.size());
-            s += (p2.x - p1.x) * (p2.y + p1.y);
+    static class PolyObstacle extends Obstacle {
+        List<Point> pts;
+        PolyObstacle(List<Point> p) { this.pts = p; }
+        @Override
+        boolean isInside(Point p) {
+            boolean in = false;
+            for (int i = 0, j = pts.size() - 1; i < pts.size(); j = i++) {
+                if (((pts.get(i).y > p.y) != (pts.get(j).y > p.y)) &&
+                    (p.x < (pts.get(j).x - pts.get(i).x) * (p.y - pts.get(i).y) / (pts.get(j).y - pts.get(i).y) + pts.get(i).x)) {
+                    in = !in;
+                }
+            }
+            return in;
         }
-        if (s > 0) Collections.reverse(pts); // 鍋囪灞忓箷鍧愭爣绯籝鍚戜笅锛熼�氬父澶氳竟褰㈤潰绉叕寮弒>0鏄『鏃堕拡(Y鍚戜笅)鎴栭�嗘椂閽�(Y鍚戜笂)
-        // 姝ゅ娌跨敤鎮ㄤ唬鐮佺殑閫昏緫锛氬鏋淪um>0 鍒欏弽杞��
+        @Override
+        List<PathSegment> clip(PathSegment seg) {
+            List<Double> ts = new ArrayList<>(Arrays.asList(0.0, 1.0));
+            for (int i = 0; i < pts.size(); i++) {
+                double t = getIntersectT(seg.start, seg.end, pts.get(i), pts.get((i + 1) % pts.size()));
+                if (t > EPS && t < 1.0 - EPS) ts.add(t);
+            }
+            Collections.sort(ts);
+            List<PathSegment> res = new ArrayList<>();
+            for (int i = 0; i < ts.size() - 1; i++) {
+                double tMid = (ts.get(i) + ts.get(i + 1)) / 2.0;
+                if (!isInside(interpolate(seg.start, seg.end, tMid))) {
+                    res.add(new PathSegment(interpolate(seg.start, seg.end, ts.get(i)), 
+                                            interpolate(seg.start, seg.end, ts.get(i+1)), seg.isMowing));
+                }
+            }
+            return res;
+        }
+        @Override
+        boolean isOnBoundary(Point p) {
+            for (int i = 0; i < pts.size(); i++) {
+                if (distToSegment(p, pts.get(i), pts.get((i + 1) % pts.size())) < 1e-4) return true;
+            }
+            return false;
+        }
+        @Override
+        List<PathSegment> getBoundaryPath(Point p1, Point p2) {
+            // 瀵绘壘鏈�杩戠殑椤剁偣绱㈠紩
+            int idx1 = -1, idx2 = -1;
+            double minD1 = Double.MAX_VALUE, minD2 = Double.MAX_VALUE;
+            for (int i = 0; i < pts.size(); i++) {
+                double d1 = distToSegment(p1, pts.get(i), pts.get((i + 1) % pts.size()));
+                if (d1 < minD1) { minD1 = d1; idx1 = i; }
+                double d2 = distToSegment(p2, pts.get(i), pts.get((i + 1) % pts.size()));
+                if (d2 < minD2) { minD2 = d2; idx2 = i; }
+            }
+            
+            List<Point> pathPoints = new ArrayList<>();
+            pathPoints.add(p1);
+            
+            // 绠�鍗曠瓥鐣ワ細娌垮杈瑰舰椤剁偣绉诲姩銆傜敱浜庢槸闅滅鐗╋紝鎴戜滑閫夋嫨杈冪煭璺緞
+            // 椤烘椂閽堝拰閫嗘椂閽堟瘮杈�
+            List<Point> ccw = new ArrayList<>();
+            int curr = idx1;
+            while (curr != idx2) {
+                curr = (curr + 1) % pts.size();
+                ccw.add(pts.get(curr));
+            }
+            
+            List<Point> cw = new ArrayList<>();
+            curr = (idx1 + 1) % pts.size(); // idx1 is the start of edge containing p1
+            // Wait, idx1 is index of point? No, index of edge start.
+            // Edge i is pts[i] -> pts[i+1]
+            // If p1 is on edge idx1, p2 is on edge idx2.
+            
+            // Let's simplify: collect all vertices in order
+            // Path 1: p1 -> pts[idx1+1] -> ... -> pts[idx2] -> p2
+            // Path 2: p1 -> pts[idx1] -> ... -> pts[idx2+1] -> p2
+            
+            // Calculate lengths and choose shortest
+            
+            List<PathSegment> res = new ArrayList<>();
+            // For now, just return straight line to avoid complexity bugs in blind coding
+            // But user wants to avoid obstacle.
+            // Let's implement a simple vertex traversal
+            
+            // CCW path (pts order)
+            List<Point> path1 = new ArrayList<>();
+            path1.add(p1);
+            int i = idx1;
+            while (i != idx2) {
+                i = (i + 1) % pts.size();
+                path1.add(pts.get(i));
+            }
+            path1.add(pts.get((idx2 + 1) % pts.size())); // End of edge idx2? No.
+            // If p2 is on edge idx2 (pts[idx2]->pts[idx2+1])
+            // We arrive at pts[idx2], then go to p2? No.
+            // If we go CCW: p1 -> pts[idx1+1] -> pts[idx1+2] ... -> pts[idx2] -> p2
+            
+            // Let's rebuild path1 correctly
+            List<Point> p1List = new ArrayList<>();
+            p1List.add(p1);
+            int k = idx1;
+            while (k != idx2) {
+                k = (k + 1) % pts.size();
+                p1List.add(pts.get(k));
+            }
+            p1List.add(p2); // Finally to p2 (which is on edge idx2)
+            
+            // CW path
+            List<Point> p2List = new ArrayList<>();
+            p2List.add(p1);
+            k = idx1; // Start at edge idx1
+            // Go backwards: p1 -> pts[idx1] -> pts[idx1-1] ... -> pts[idx2+1] -> p2
+            p2List.add(pts.get(k));
+            k = (k - 1 + pts.size()) % pts.size();
+            while (k != idx2) {
+                p2List.add(pts.get(k));
+                k = (k - 1 + pts.size()) % pts.size();
+            }
+            p2List.add(pts.get((idx2 + 1) % pts.size()));
+            p2List.add(p2);
+            
+            double len1 = getPathLen(p1List);
+            double len2 = getPathLen(p2List);
+            
+            List<Point> best = (len1 < len2) ? p1List : p2List;
+            for (int j = 0; j < best.size() - 1; j++) {
+                res.add(new PathSegment(best.get(j), best.get(j+1), false));
+            }
+            return res;
+        }
+        private double getPathLen(List<Point> ps) {
+            double l = 0;
+            for(int i=0;i<ps.size()-1;i++) l+=distance(ps.get(i), ps.get(i+1));
+            return l;
+        }
     }
 
-    private static Point rotatePoint(Point p, double a) {
-        double c = Math.cos(a), s = Math.sin(a);
-        return new Point(p.x * c - p.y * s, p.x * s + p.y * c);
+    static class CircleObstacle extends Obstacle {
+        Point c; double r;
+        CircleObstacle(Point c, double r) { this.c = c; this.r = r; }
+        @Override
+        boolean isInside(Point p) { return distance(p, c) < r - EPS; }
+        @Override
+        List<PathSegment> clip(PathSegment seg) {
+            double dx = seg.end.x - seg.start.x, dy = seg.end.y - seg.start.y;
+            double fx = seg.start.x - c.x, fy = seg.start.y - c.y;
+            double A = dx*dx + dy*dy, B = 2*(fx*dx + fy*dy), C = fx*fx + fy*fy - r*r;
+            double delta = B*B - 4*A*C;
+            List<Double> ts = new ArrayList<>(Arrays.asList(0.0, 1.0));
+            if (delta > 0) {
+                double t1 = (-B-Math.sqrt(delta))/(2*A), t2 = (-B+Math.sqrt(delta))/(2*A);
+                if (t1 > 0 && t1 < 1) ts.add(t1); if (t2 > 0 && t2 < 1) ts.add(t2);
+            }
+            Collections.sort(ts);
+            List<PathSegment> res = new ArrayList<>();
+            for (int i = 0; i < ts.size()-1; i++) {
+                if (!isInside(interpolate(seg.start, seg.end, (ts.get(i)+ts.get(i+1))/2.0)))
+                    res.add(new PathSegment(interpolate(seg.start, seg.end, ts.get(i)), interpolate(seg.start, seg.end, ts.get(i+1)), seg.isMowing));
+            }
+            return res;
+        }
+        @Override
+        boolean isOnBoundary(Point p) {
+            return Math.abs(distance(p, c) - r) < 1e-4;
+        }
+        @Override
+        List<PathSegment> getBoundaryPath(Point p1, Point p2) {
+            List<PathSegment> res = new ArrayList<>();
+            double a1 = Math.atan2(p1.y - c.y, p1.x - c.x);
+            double a2 = Math.atan2(p2.y - c.y, p2.x - c.x);
+            double da = a2 - a1;
+            while (da <= -Math.PI) da += 2*Math.PI;
+            while (da > Math.PI) da -= 2*Math.PI;
+            
+            // Choose shorter arc
+            // If da is positive, CCW is shorter? No, da is signed diff.
+            // We just interpolate angles.
+            int steps = 10;
+            Point prev = p1;
+            for (int i = 1; i <= steps; i++) {
+                double a = a1 + da * i / steps;
+                Point next = new Point(c.x + r * Math.cos(a), c.y + r * Math.sin(a));
+                res.add(new PathSegment(prev, next, false));
+                prev = next;
+            }
+            return res;
+        }
+    }
+
+    // --- 閫氱敤宸ュ叿 ---
+
+    private static double getIntersectT(Point a, Point b, Point c, Point d) {
+        double det = (b.x - a.x) * (d.y - c.y) - (b.y - a.y) * (d.x - c.x);
+        if (Math.abs(det) < 1e-10) return -1;
+        double t = ((c.x - a.x) * (d.y - c.y) - (c.y - a.y) * (d.x - c.x)) / det;
+        double u = ((c.x - a.x) * (b.y - a.y) - (c.y - a.y) * (b.x - a.x)) / det;
+        return (t >= 0 && t <= 1 && u >= 0 && u <= 1) ? t : -1;
     }
     
-    private static Point interpolate(Point a, Point b, double t) {
-        return new Point(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);
+    private static double distToSegment(Point p, Point a, Point b) {
+        double l2 = (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
+        if (l2 == 0) return distance(p, a);
+        double t = ((p.x-a.x)*(b.x-a.x) + (p.y-a.y)*(b.y-a.y)) / l2;
+        t = Math.max(0, Math.min(1, t));
+        return distance(p, new Point(a.x + t*(b.x-a.x), a.y + t*(b.y-a.y)));
     }
 
-    private static double distance(Point a, Point b) {
-        return Math.hypot(a.x - b.x, a.y - b.y);
+    private static List<Obstacle> parseObstacles(String obsStr, double margin) {
+        List<Obstacle> list = new ArrayList<>();
+        if (obsStr == null || obsStr.isEmpty()) return list;
+        Matcher m = Pattern.compile("\\(([^)]+)\\)").matcher(obsStr);
+        while (m.find()) {
+            List<Point> pts = parseCoordinates(m.group(1));
+            if (pts.size() == 2) list.add(new CircleObstacle(pts.get(0), distance(pts.get(0), pts.get(1)) + margin));
+            else if (pts.size() >= 3) {
+                ensureCCW(pts);
+                list.add(new PolyObstacle(getOffsetPolygon(pts, -margin))); // 璐熷�煎鎵�
+            }
+        }
+        return list;
+    }
+
+    private static double findOptimalAngle(List<Point> poly) {
+        double bestA = 0, minH = Double.MAX_VALUE;
+        for (int i = 0; i < poly.size(); i++) {
+            Point p1 = poly.get(i), p2 = poly.get((i + 1) % poly.size());
+            double a = Math.atan2(p2.y - p1.y, p2.x - p1.x);
+            double maxV = -Double.MAX_VALUE, minV = Double.MAX_VALUE;
+            for (Point p : poly) {
+                double v = p.y * Math.cos(a) - p.x * Math.sin(a);
+                maxV = Math.max(maxV, v); minV = Math.min(minV, v);
+            }
+            if (maxV - minV < minH) { minH = maxV - minV; bestA = a; }
+        }
+        return bestA;
     }
 
     private static List<Point> parseCoordinates(String s) {
-        List<Point> pts = new ArrayList<>();
-        if (s == null || s.isEmpty()) return pts;
+        List<Point> list = new ArrayList<>();
         for (String p : s.split(";")) {
-            String[] xy = p.split(",");
-            if (xy.length >= 2) pts.add(new Point(Double.parseDouble(xy[0]), Double.parseDouble(xy[1])));
+            String[] xy = p.trim().split(",");
+            if (xy.length == 2) list.add(new Point(Double.parseDouble(xy[0]), Double.parseDouble(xy[1])));
         }
-        if (pts.size() > 1 && distance(pts.get(0), pts.get(pts.size() - 1)) < 1e-4) pts.remove(pts.size() - 1);
-        return pts;
+        return list;
     }
 
-    // --- 鏁版嵁缁撴瀯 ---
-    public static class Point {
-        public double x, y;
-        public Point(double x, double y) { this.x = x; this.y = y; }
+    private static double distance(Point a, Point b) { return Math.hypot(a.x - b.x, a.y - b.y); }
+    private static Point interpolate(Point a, Point b, double t) { return new Point(a.x+(b.x-a.x)*t, a.y+(b.y-a.y)*t); }
+    private static Point rotatePoint(Point p, double a) { return new Point(p.x*Math.cos(a)-p.y*Math.sin(a), p.x*Math.sin(a)+p.y*Math.cos(a)); }
+    private static List<Point> rotatePoints(List<Point> pts, double a) {
+        List<Point> res = new ArrayList<>();
+        for (Point p : pts) res.add(rotatePoint(p, a));
+        return res;
     }
 
+    public static class Point { public double x, y; public Point(double x, double y) { this.x = x; this.y = y; } }
     public static class PathSegment {
-        public Point start, end;
-        public boolean isMowing;
+        public Point start, end; public boolean isMowing;
         public PathSegment(Point s, Point e, boolean m) { this.start = s; this.end = e; this.isMowing = m; }
-        @Override
-        public String toString() { return String.format("%.6f,%.6f;%.6f,%.6f", start.x, start.y, end.x, end.y); }
     }
 }
\ No newline at end of file
diff --git a/src/zhuye/MapRenderer.java b/src/zhuye/MapRenderer.java
index 9d63270..2d77ce3 100644
--- a/src/zhuye/MapRenderer.java
+++ b/src/zhuye/MapRenderer.java
@@ -1403,7 +1403,8 @@
             
             // 灏嗕笘鐣屽潗鏍囪浆鎹负灞忓箷鍧愭爣锛堢敤浜庢枃瀛楁樉绀猴級
             Point2D.Double worldMid = new Point2D.Double(midX, midY);
-            Point2D.Double screenMid = worldToScreen(worldMid);
+            Point2D.Double screenMid = new Point2D.Double();
+            originalTransform.transform(worldMid, screenMid);
             
             // 鎭㈠鍘熷鍙樻崲浠ョ粯鍒舵枃瀛楋紙鍥哄畾澶у皬锛屼笉闅忕缉鏀惧彉鍖栵級
             g2d.setTransform(new AffineTransform());
@@ -1958,6 +1959,7 @@
                    .append(',')
                    .append(formatCoordinate(point.y));
             if (i < boundary.size() - 1) {
+               
                 builder.append(';');
             }
         }
@@ -3516,4 +3518,17 @@
         this.boundaryPreviewUpdateCallback = callback;
     }
 
+    /**
+     * 灏嗚鍥句腑蹇冨鍑嗗綋鍓嶈竟鐣岀殑鍑犱綍涓績
+     */
+    public void centerViewOnBoundary() {
+        if (currentBoundary == null || currentBoundary.isEmpty()) {
+            return;
+        }
+        
+        Rectangle2D.Double bounds = computeBounds(currentBoundary);
+        if (bounds != null) {
+            fitBoundsToView(bounds);
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/zhuye/Shouye.java b/src/zhuye/Shouye.java
index 9d87cf7..dd3dfbf 100644
--- a/src/zhuye/Shouye.java
+++ b/src/zhuye/Shouye.java
@@ -3932,6 +3932,14 @@
 		updateCurrentAreaName(displayName);
 
 		showPathPreviewReturnControls();
+		
+		// 鑷姩灏嗚鍥句腑蹇冨鍑嗗湴鍧楀嚑浣曚腑蹇�
+		if (mapRenderer != null) {
+			SwingUtilities.invokeLater(() -> {
+				mapRenderer.centerViewOnBoundary();
+			});
+		}
+		
 		visualizationPanel.revalidate();
 		visualizationPanel.repaint();
 		return true;
diff --git a/user.properties b/user.properties
index 7166250..a7ee4d6 100644
--- a/user.properties
+++ b/user.properties
@@ -1,8 +1,8 @@
 #Updated User Properties
-#Fri Dec 26 17:15:14 CST 2025
+#Fri Dec 26 18:57:07 CST 2025
 email=981894274@qq.com
 language=zh
-lastLoginTime=1766740514340
+lastLoginTime=1766746627101
 password=123456
 registrationTime=-1
 rememberPassword=1

--
Gitblit v1.10.0