Skip to content
Snippets Groups Projects
Commit 7b08022c authored by CHAPUSOT Alexis's avatar CHAPUSOT Alexis
Browse files

Ajout dijkstra

parent 51d7fc3f
No related branches found
No related tags found
No related merge requests found
Showing
with 377 additions and 24 deletions
plugins {
plugins {
id("com.android.application")
}
......
......@@ -21,11 +21,13 @@
android:supportsRtl="true"
android:theme="@style/Theme.BuildingVisitor"
tools:targetApi="33">
<activity
android:name=".chooseDestination"
android:exported="false"/>
<activity
android:name=".VisitorActivity"
android:exported="false"
android:screenOrientation="landscape"
/>
android:screenOrientation="landscape"/>
<activity
android:name=".chooseStart"
android:exported="false"/>
......
package com.example.buildingvisitor.Data;
public class AccessDijkstra {
private Access access;
private int wall;
public AccessDijkstra(Access a,int w){
this.access = a;
this.wall = w;
}
public Access getAccess(){
return access;
}
public int getWall(){
return wall;
}
}
package com.example.buildingvisitor.Data;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
......@@ -25,7 +27,10 @@ public class Building implements Iterable<Room> {
private String uuid;
private ArrayList<Room> workingRoom=new ArrayList<>();
private String location;
private ArrayList<Double> distance = new ArrayList<>();
private ArrayList<Double> distance = new ArrayList<Double>();
private ArrayList<Room> predecesseur = new ArrayList<>();
private ArrayList<AccessDijkstra> accessList = new ArrayList<>();
private int numeroEtape;
public Building(String Name){
......@@ -206,4 +211,119 @@ public class Building implements Iterable<Room> {
}
return null;
}
}
private void initialisation(Room s1){
distance.clear();
predecesseur.clear();
accessList.clear();
numeroEtape =0;
int i = 0;
for(Room r:rooms){
if(r!=s1) {
r.setNumDjisktra(i);
distance.add(Double.POSITIVE_INFINITY);
predecesseur.add(null);
i++;
}
}
distance.add((double) 0);
predecesseur.add(null);
s1.setNumDjisktra(i);
Log.i("building",distance.size()+"");
}
private Room findMin(ArrayList<Room> q){
double mini = Double.POSITIVE_INFINITY;
Room s=null;
for (Room r:q){
double distanceVal=distance.get(r.getNumDjisktra());
if(distanceVal<mini){
mini = distanceVal;
s=r;
}
}
return s;
}
private void levelUpdate(Room s1,Room s2){
Double distanceS2 = distance.get(s2.getNumDjisktra());
Double distanceS1 = distance.get(s1.getNumDjisktra());
if(distanceS2>distanceS1+1){
distance.set(s2.getNumDjisktra(),distanceS1+1);
predecesseur.set(s2.getNumDjisktra(),s1);
}
}
public boolean dijkstra(Room deb, Room fin) {
if(deb==fin){
return false;
}
initialisation(deb);
ArrayList<Room> q = new ArrayList<>(rooms);
Room s1;
while (!q.isEmpty()) {
s1 = findMin(q);
q.remove(s1);
for (Room r : rooms) {
if (r != s1) {
for (Wall w : r) {
for (Access a : w) {
if (a.getRoom() == s1) {
levelUpdate(s1, r);
}
}
}
}
}
}
if (distance.get(fin.getNumDjisktra()).isInfinite()) {
return false;
}
Room s = fin;
Room sallePredecesseur;
while (s != deb) {
sallePredecesseur = predecesseur.get(s.getNumDjisktra());
boolean exist = false;
int i = 0;
for (Wall w : sallePredecesseur) {
for (Access access : w) {
if (access.getRoom() == s) {
if(!exist) {
exist=true;
AccessDijkstra accessDijkstra = new AccessDijkstra(access,i);
accessList.add(0, accessDijkstra);
}
}
}
i++;
Log.i("test",i+" au moment de l'ajout");
}
s = sallePredecesseur;
}
return true;
}
public int check(Access a,Room deb,Room fin){
if(deb==fin){
return 2;
}
if(accessList.get(numeroEtape).getAccess()==a){
if(++numeroEtape==accessList.size()){
return 2;
}
return 1;
}
else{
Log.i("FAIL","je recalcul");
dijkstra(deb,fin);
}
return 0;
}
public Access getAccesStep(){
return accessList.get(numeroEtape).getAccess();
}
public int getWallStep(){return accessList.get(numeroEtape).getWall();}
}
package com.example.buildingvisitor;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.*;
import android.util.Log;
import android.view.MotionEvent;
......@@ -9,13 +10,14 @@ import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.example.buildingvisitor.Data.Access;
import com.example.buildingvisitor.Data.BuildingManager;
import com.example.buildingvisitor.Data.Coordonéees;
import com.example.buildingvisitor.Data.Room;
import com.example.buildingvisitor.Data.*;
import java.io.File;
import java.io.FileInputStream;
......@@ -33,36 +35,75 @@ public class VisitorActivity extends AppCompatActivity {
private Button murSud;
private Button murOuest;
private boolean debounce = true;
private boolean gps = false;
private Room destination;
private ActivityResultLauncher<Intent> destinationLauncher;
private Button gpsButton;
private TextView orientation;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_visitor);
orientation = findViewById(R.id.orientation);
orientation.setTextColor(Color.WHITE);
orientation.setText(getResources().getString(R.string.boutonNord));
surfaceVisit = findViewById(R.id.surfaceVisit);
imageVisit = findViewById(R.id.ImageVisit);
surfaceVisit.setZOrderOnTop(true);
murNord = findViewById(R.id.murNord);
murEst = findViewById(R.id.murEst);
murSud = findViewById(R.id.murSud);
gpsButton = findViewById(R.id.gpsButton);
murOuest = findViewById(R.id.murOuest);
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
paint.setStrokeWidth(4);
paint.setColor(Color.RED);
holder = surfaceVisit.getHolder();
holder.setFormat(PixelFormat.TRANSPARENT);
destinationLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result->{
Building building = BuildingManager.getInstance().getCurrentBuilding();
if(result.getResultCode()==RESULT_OK){
destination = building.getLastWorkingRoom();
building.cancelRoom();
if(building.dijkstra(room,destination)){
gps = true;
if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 0){
murNord.setBackgroundColor(Color.RED);
}
if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 1){
murEst.setBackgroundColor(Color.RED);
}
if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 2){
murSud.setBackgroundColor(Color.RED);
}
if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 3){
murOuest.setBackgroundColor(Color.RED);
}
}
else{
gps = false;
Toast.makeText(this,"pas de chemin entre ces deux pièces",Toast.LENGTH_LONG).show();
}
}
else{
building.cancelRoom();
gps=false;
}
});
gpsButton.setOnClickListener((view)->{
Intent intent = new Intent(this, chooseDestination.class);
BuildingManager.getInstance().getCurrentBuilding().addWorkingRoom(room);
destinationLauncher.launch(intent);
});
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
for(Access a:BuildingManager.getInstance().getCurrentBuilding().getLastWorkingRoom().getWall(actualWall)){
Coordonéees coordonéees = a.getCoordonéees();
Rect rect = new Rect(coordonéees.getX(),coordonéees.getY(),coordonéees.getWidth(),coordonéees.getHeigth());
canvas.drawRect(rect,paint);
}
holder.unlockCanvasAndPost(canvas);
drawAccess();
}
@Override
......@@ -76,21 +117,25 @@ public class VisitorActivity extends AppCompatActivity {
}
});
murNord.setOnClickListener((view)->{
orientation.setText(getResources().getString(R.string.boutonNord));
actualWall = 0;
setupImageRoom();
drawAccess();
});
murEst.setOnClickListener((view)->{
orientation.setText(getResources().getString(R.string.boutonEst));
actualWall = 1;
setupImageRoom();
drawAccess();
});
murSud.setOnClickListener((view)->{
orientation.setText(getResources().getString(R.string.boutonSud));
actualWall = 2;
setupImageRoom();
drawAccess();
});
murOuest.setOnClickListener((view)->{
orientation.setText(getResources().getString(R.string.boutonOuest));
actualWall = 3;
setupImageRoom();
drawAccess();
......@@ -110,9 +155,42 @@ public class VisitorActivity extends AppCompatActivity {
Rect rect = new Rect(c.getX(),c.getY(),c.getWidth(),c.getHeigth());
if(rect.contains(x,y)){
room = a.getRoom();
if(gps) {
//le parcours est fini
if(BuildingManager.getInstance().getCurrentBuilding().check(a,room,destination)==2){
gps=false;
Toast.makeText(this,"vous etes arrivez",Toast.LENGTH_LONG).show();
}else{
}
}
Log.i("Visitor","je change de pièce");
}
setupImageRoom();
if(gps){
if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 0){
murNord.setBackgroundColor(Color.RED);
}
if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 1){
murEst.setBackgroundColor(Color.RED);
}
if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 2){
murSud.setBackgroundColor(Color.RED);
}
if(BuildingManager.getInstance().getCurrentBuilding().getWallStep() == 3){
murOuest.setBackgroundColor(Color.RED);
}
}
else{
murNord.setBackgroundColor(Color.argb(255,104,87,140));
murSud.setBackgroundColor(Color.argb(255,104,87,140));
murOuest.setBackgroundColor(Color.argb(255,104,87,140));
murEst.setBackgroundColor(Color.argb(255,104,87,140));
}
drawAccess();
break;
}
......@@ -140,8 +218,47 @@ public class VisitorActivity extends AppCompatActivity {
for(Access a:room.getWall(actualWall)){
Coordonéees coordonéees = a.getCoordonéees();
Rect rect = new Rect(coordonéees.getX(),coordonéees.getY(),coordonéees.getWidth(),coordonéees.getHeigth());
paint.setColor(Color.RED);
if(gps) {
if (a == BuildingManager.getInstance().getCurrentBuilding().getAccesStep()) {
paint.setColor(Color.BLUE);
} else {
paint.setColor(Color.RED);
}
}
else{
paint.setColor(Color.RED);
}
canvas.drawRect(rect,paint);
}
holder.unlockCanvasAndPost(canvas);
}
@Override
protected void onResume() {
super.onResume();
surfaceVisit = findViewById(R.id.surfaceVisit);
holder = surfaceVisit.getHolder();
Canvas canvas = holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for (Access a : room.getWall(actualWall)) {
Coordonéees coordonéees = a.getCoordonéees();
Rect rect = new Rect(coordonéees.getX(), coordonéees.getY(), coordonéees.getWidth(), coordonéees.getHeigth());
paint.setColor(Color.RED);
if (gps) {
if (a == BuildingManager.getInstance().getCurrentBuilding().getAccesStep()) {
paint.setColor(Color.BLUE);
} else {
paint.setColor(Color.RED);
}
} else {
paint.setColor(Color.RED);
}
canvas.drawRect(rect, paint);
}
holder.unlockCanvasAndPost(canvas);
}
}
}
\ No newline at end of file
package com.example.buildingvisitor;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.example.buildingvisitor.Data.BuildingManager;
import com.example.buildingvisitor.Data.Room;
import java.util.ArrayList;
public class chooseDestination extends AppCompatActivity {
private ListView listRoom;
private ArrayAdapter<Room> adapter;
private ArrayList<Room> rooms;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_start);
rooms = new ArrayList<>();
setupList();
adapter = new ArrayAdapter<Room>(this, android.R.layout.simple_list_item_2, android.R.id.text2, rooms) {
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView text = view.findViewById(android.R.id.text2);
text.setTextColor(Color.WHITE);
text.setText(rooms.get(position).getName());
return view;
}
};
listRoom = findViewById(R.id.listRoom);
listRoom.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i("choose",rooms.get(position).getName());
Log.i("position", String.valueOf(position));
BuildingManager.getInstance().getCurrentBuilding().addWorkingRoom(rooms.get(position));
setResult(RESULT_OK);
finish();
}
});
listRoom.setAdapter(adapter);
}
/* private void launchVisit() {
Intent intent = new Intent(this,VisitorActivity.class);
startActivity(intent);
}*/
private void setupList() {
rooms.clear();;
for(Room r: BuildingManager.getInstance().getCurrentBuilding()){
if(r!=BuildingManager.getInstance().getCurrentBuilding().getLastWorkingRoom()) {
rooms.add(r);
Log.i("roomName",r.getName());
}
}
}
}
\ No newline at end of file
package com.example.buildingvisitor;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
......@@ -30,6 +31,7 @@ public class chooseStart extends AppCompatActivity {
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView text = view.findViewById(android.R.id.text2);
text.setTextColor(Color.WHITE);
text.setText(rooms.get(position).getName());
return view;
}
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".chooseDestination">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -13,8 +13,9 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="250dp" android:id="@+id/ListFile"/>
<TextView
android:text="TextView"
android:text="Choissisez votre batiment"
android:layout_width="163dp"
android:layout_height="39dp" android:id="@+id/textView3" tools:layout_editor_absoluteY="55dp"
tools:layout_editor_absoluteX="140dp"/>
android:layout_height="39dp" android:id="@+id/textView3"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="100dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -16,7 +16,7 @@
android:text="BuildingVisitor"
android:layout_width="324dp"
android:layout_height="69dp" android:id="@+id/textView"
android:textSize="50dp" app:layout_constraintTop_toTopOf="parent"
android:textSize="40dp" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
android:layout_marginTop="60dp" android:textColor="#FFFFFF"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -12,8 +12,8 @@
android:layout_width="37dp"
android:layout_height="48dp" android:id="@+id/murNord"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="150dp" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="60dp" app:layout_constraintEnd_toStartOf="@+id/frameLayout"
android:layout_marginTop="160dp" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="65dp" app:layout_constraintEnd_toStartOf="@+id/frameLayout"
android:layout_marginEnd="40dp"/>
<Button
android:text="@string/boutonEst"
......@@ -87,4 +87,18 @@
android:layout_width="match_parent"
android:layout_height="match_parent" android:id="@+id/surfaceVisit"/>
</FrameLayout>
<Button
android:text="GPS"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/gpsButton"
app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="20dp"
app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="50dp"/>
<TextView
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/orientation"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="45dp" android:layout_marginStart="70dp"
android:textSize="32dp"
app:layout_constraintStart_toEndOf="@+id/gpsButton"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment