Commit 70c0b9422de8cb43045448c8c63a79ea3d1d13c6

Authored by Jiaming Guo
1 parent f4105b89

fixed bug when height < n * radius

Showing 1 changed file with 35 additions and 62 deletions   Show diff stats
... ... @@ -1305,60 +1305,6 @@ namespace stim {
1305 1305 }
1306 1306 }
1307 1307  
1308   - // inlet connection
1309   - for (unsigned i = 0; i < inlet.size(); i++) {
1310   - v1 = inlet[i].V[2] - inlet[i].V[1];
1311   - v2 = v0 - inlet[i].V[1];
1312   - v3 = v0 - inlet[i].V[2];
1313   -
1314   - tmp_d = v2.dot(v1); // av·ab
1315   -
1316   - // check the line relative position
1317   - a = v2.dot(v1.norm());
1318   - b = v3.dot(v1.norm());
1319   - if (a < v1.len() && b < v1.len()) // if the length of projection fragment is longer than the line-segment
1320   - online = true;
1321   - else
1322   - online = false;
1323   -
1324   - if (tmp_d <= 0.0 || tmp_d > std::pow(v1.len(), 2) && !online) // projection lies outside the line-segment
1325   - continue;
1326   - else {
1327   - tmp_d = v1.cross(v2).len() / v1.len(); // perpendicular distance of point to segment: |v1 x v2| / |v1|
1328   - if (tmp_d < d) {
1329   - d = tmp_d;
1330   - tmp_i = i;
1331   - }
1332   - }
1333   - }
1334   -
1335   - // outlet connection
1336   - for (unsigned i = 0; i < outlet.size(); i++) {
1337   - v1 = outlet[i].V[2] - outlet[i].V[1];
1338   - v2 = v0 - outlet[i].V[1];
1339   - v3 = v0 - outlet[i].V[2];
1340   -
1341   - tmp_d = v2.dot(v1); // av·ab
1342   -
1343   - // check the line relative position
1344   - a = v2.dot(v1.norm());
1345   - b = v3.dot(v1.norm());
1346   - if (a < v1.len() && b < v1.len()) // if the length of projection fragment is longer than the line-segment
1347   - online = true;
1348   - else
1349   - online = false;
1350   -
1351   - if (tmp_d <= 0.0 || tmp_d > std::pow(v1.len(), 2) && !online) // projection lies outside the line-segment
1352   - continue;
1353   - else {
1354   - tmp_d = v1.cross(v2).len() / v1.len(); // perpendicular distance of point to segment: |v1 x v2| / |v1|
1355   - if (tmp_d < d) {
1356   - d = tmp_d;
1357   - tmp_i = i;
1358   - }
1359   - }
1360   - }
1361   -
1362 1308 eps += get_radius(tmp_i, tmp_j);
1363 1309  
1364 1310 if (d < eps) {
... ... @@ -1568,7 +1514,7 @@ namespace stim {
1568 1514 int find_number_square(T origin_l, T desire_l, T radius = 5.0f, int times = 4) {
1569 1515  
1570 1516 bool done = false; // flag indicates the current number of square shape structure is feasible
1571   - int n = origin_l / (times * 2 * radius); // number of square shape structure
  1517 + int n = origin_l / (times * 4 * radius);// number of square shape structure
1572 1518 T need_l = desire_l - origin_l;
1573 1519 T height; // height of the square shapce structure
1574 1520  
... ... @@ -1596,9 +1542,9 @@ namespace stim {
1596 1542 std::pair<stim::vec3<T>, stim::vec3<T>> tmp_bb;
1597 1543 stim::vec3<T> tmp_v;
1598 1544 if (feeder == 1)
1599   - tmp_v = inlet[i].V[0];
  1545 + tmp_v = inlet[i].V[inlet[i].V.size() - 1];
1600 1546 else if (feeder == 0)
1601   - tmp_v = outlet[i].V[0];
  1547 + tmp_v = outlet[i].V[outlet[i].V.size() - 1];
1602 1548 tmp_bb.first = tmp_v;
1603 1549  
1604 1550 // check whether the height of connections is acceptable
... ... @@ -1723,6 +1669,15 @@ namespace stim {
1723 1669 }
1724 1670 }
1725 1671 else {
  1672 + if (height < times * radius) { // if height is too small, decrease n and re-calculate height and width
  1673 + height = times * radius;
  1674 + T need_l = desire_l - origin_l;
  1675 + n = need_l / (2 * height);
  1676 + if (n == 0)
  1677 + n = 1;
  1678 + height = need_l / (2 * n);
  1679 + width = origin_l / (2 * n);
  1680 + }
1726 1681 for (int j = 0; j < n; j++) {
1727 1682  
1728 1683 // up
... ... @@ -2000,7 +1955,7 @@ namespace stim {
2000 1955  
2001 1956 bus_v = inlet[i].V[0];
2002 1957 mid_v = inlet[i].V[1];
2003   - tmp_v = inlet[i].V[2];
  1958 + tmp_v = inlet[i].V[2]; // not always pendant vertex
2004 1959  
2005 1960 if (inlet[i].V[2][1] > main_feeder[0][1]) // check out upper side of lower side
2006 1961 upper = true;
... ... @@ -2014,8 +1969,17 @@ namespace stim {
2014 1969  
2015 1970 T origin_l = (inlet[i].V[1] - inlet[i].V[2]).len();
2016 1971 T desire_l = new_l - (inlet[i].V[0] - inlet[i].V[1]).len();
2017   - inlet[i].V.clear();
2018   - inlet[i].V.push_back(tmp_v);
  1972 + if (inlet[i].V.size() != 3) {
  1973 + desire_l = new_l - (inlet[i].V[0] - inlet[i].V[1]).len() - (inlet[i].V[2] - inlet[i].V[3]).len();
  1974 + stim::vec3<T> tmp = inlet[i].V[3];
  1975 + inlet[i].V.clear();
  1976 + inlet[i].V.push_back(tmp);
  1977 + inlet[i].V.push_back(tmp_v);
  1978 + }
  1979 + else {
  1980 + inlet[i].V.clear();
  1981 + inlet[i].V.push_back(tmp_v);
  1982 + }
2019 1983 inlet[i].l = new_l;
2020 1984  
2021 1985 n = find_number_square(origin_l, desire_l);
... ... @@ -2054,8 +2018,17 @@ namespace stim {
2054 2018  
2055 2019 T origin_l = (outlet[i].V[1] - outlet[i].V[2]).len();
2056 2020 T desire_l = new_l - (outlet[i].V[0] - outlet[i].V[1]).len();
2057   - outlet[i].V.clear();
2058   - outlet[i].V.push_back(tmp_v);
  2021 + if (outlet[i].V.size() != 3) {
  2022 + desire_l = new_l - (outlet[i].V[0] - outlet[i].V[1]).len() - (outlet[i].V[2] - outlet[i].V[3]).len();
  2023 + stim::vec3<T> tmp = outlet[i].V[3];
  2024 + outlet[i].V.clear();
  2025 + outlet[i].V.push_back(tmp);
  2026 + outlet[i].V.push_back(tmp_v);
  2027 + }
  2028 + else {
  2029 + outlet[i].V.clear();
  2030 + outlet[i].V.push_back(tmp_v);
  2031 + }
2059 2032 outlet[i].l = new_l;
2060 2033  
2061 2034 n = find_number_square(origin_l, desire_l);
... ...