/*---------------------------------------------------------------------------------------------------------------- * CupCarbon: OSM based Wireless Sensor Network design and simulation tool * www.cupcarbon.com * ---------------------------------------------------------------------------------------------------------------- * Copyright (C) 2015 Ahcene Bounceur * ---------------------------------------------------------------------------------------------------------------- * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. *----------------------------------------------------------------------------------------------------------------*/ package solver; import device.DeviceList; import device.SensorNode; import map.MapLayer; /** * @author Ahcene Bounceur * @author Ali Benzerbadj * @author Farid Lalem * @author Massinissa Saoudi * @version 1.0 */ public class NetworkEnvelopeH2 extends Thread { @Override public void run() { SensorNode n1, n2, nv; double x1 = 0; double y1 = 0; double x2 = 0; double y2 = 0; double xc = 0; double yc = 0; double angle = 0; int cur = 0; int prem = 0; double min = 0; int imin = 0; boolean trouve = false; boolean fini = false; int sm = 0; DeviceList.initAll(); DeviceList.addHull(); while (true) { DeviceList.initLastHull(); min = 10000000; imin = 0; for (int i = 0; i < DeviceList.sensors.size(); i++) { DeviceList.sensors.get(i).setValue(0); DeviceList.sensors.get(i).setMarked(false); DeviceList.sensors.get(i).setVisited(false); if (!DeviceList.sensors.get(i).isDead()) if (min > DeviceList.sensors.get(i).getLatitude()) { min = DeviceList.sensors.get(i).getLatitude(); imin = i; } } prem = imin; cur = imin; DeviceList.sensors.get(imin).setMarked(true); DeviceList.sensors.get(imin).setVisited(true); MapLayer.repaint(); DeviceList.addToLastHull(imin); delay(); n1 = DeviceList.sensors.get(cur); xc = n1.getLatitude(); yc = n1.getLongitude(); x1 = xc - 0.1; y1 = yc; trouve = false; fini = false; for (int i = 0; i < DeviceList.sensors.size() - 1; i++) { if (!fini) { min = 10000000; trouve = false; for (int j = 0; j < DeviceList.sensors.size(); j++) { n2 = DeviceList.sensors.get(j); if (!DeviceList.sensors.get(j).isDead()) if ((cur != j) && n1.radioDetect(n2)) { if (!n2.isVisited()) { trouve = true; x2 = n2.getLatitude(); y2 = n2.getLongitude(); angle = getAngle(x1 - xc, y1 - yc, x2 - xc, y2 - yc); if (angle < min && Math.toDegrees(angle) > 30) { imin = j; min = angle; } } } } if (trouve) { DeviceList.sensors.get(imin).setMarked(true); DeviceList.sensors.get(imin).setVisited(true); MapLayer.repaint(); DeviceList.addToLastHull(imin); n1 = DeviceList.sensors.get(imin); cur = imin; x1 = xc; y1 = yc; xc = DeviceList.sensors.get(imin).getLatitude(); yc = DeviceList.sensors.get(imin).getLongitude(); } else { for (int k = 0; k < DeviceList.sensors.size(); k++) { nv = DeviceList.sensors.get(k); if (n1.radioDetect(nv) && nv.isMarked()) { nv.setVisited(false); } } } sm = 0; for (int k = 0; k < DeviceList.sensors.size(); k++) { if ((k != prem) && DeviceList .sensors .get(k) .radioDetect( DeviceList.sensors.get(prem))) { if (DeviceList.sensors.get(k).isMarked()) sm++; } } if (sm >= 2) fini = true; delay(); } } // System.out.println("FINISH !"); try { sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } public double getAngle1(double x1, double y1, double x2, double y2) { x2 = x2 - x1; y2 = y2 - y1; double a = Math.atan2(x2, y2); if (a < 0) a = (2 * Math.PI) + a; return a; } public double getAngle(double x1, double y1, double x2, double y2) { double a = Math.atan2(x1, y1); if (a < 0) a = (2 * Math.PI) + a; double b = Math.atan2(x2, y2); if (b < 0) b = (2 * Math.PI) + b; b = b - a; if (b < 0) b = (2 * Math.PI) + b; return b; } public static boolean intersect(double p0_x, double p0_y, double p1_x, double p1_y, double p2_x, double p2_y, double p3_x, double p3_y) { double s1_x, s1_y, s2_x, s2_y; s1_x = p1_x - p0_x; s1_y = p1_y - p0_y; s2_x = p3_x - p2_x; s2_y = p3_y - p2_y; double s, t; s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y); t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y); if (s >= 0 && s <= 1 && t >= 0 && t <= 1) { // Collision detected return true; } return false; // No collision } public void delay() { // try { // sleep(5); // } catch (InterruptedException e) {} } }