|
|
|
@ -1,163 +1,32 @@
|
|
|
|
|
import React, { useEffect } from "react";
|
|
|
|
|
import { DataSet, Network} from "vis-network/standalone/esm/vis-network";
|
|
|
|
|
import EdgesCreator from "../source/EdgesCreator";
|
|
|
|
|
import GraphCreator from "../source/GraphCreator";
|
|
|
|
|
import IndiceChooser from "../source/IndiceChooser";
|
|
|
|
|
import NetworkGenerator from "../source/NetworkGenerator";
|
|
|
|
|
import Stub from "../source/Stub";
|
|
|
|
|
import "./GraphContainer.css";
|
|
|
|
|
|
|
|
|
|
const NB_SPORTS = 3;
|
|
|
|
|
const MIN_AGE = 20;
|
|
|
|
|
const MAX_AGE = 100;
|
|
|
|
|
const COLORS = ["blanc", "noir", "jaune", "chocolat"];
|
|
|
|
|
const SPORTS = ["foot", "tennis", "rugby", "basket"];
|
|
|
|
|
const NAMES = ["Fabien", "Mélyssa", "Kéké", "David", "Elisa", "Karina", "Fatima", "Pintrand", "Pif", "Nathan", "Thomas", "Carreau", "Léo", "Hélicoptère", "Tank"]
|
|
|
|
|
|
|
|
|
|
class Person {
|
|
|
|
|
id: number = 0;
|
|
|
|
|
name: string;
|
|
|
|
|
age: number;
|
|
|
|
|
color: string;
|
|
|
|
|
sport: string[];
|
|
|
|
|
friends: Person[] = [];
|
|
|
|
|
|
|
|
|
|
constructor(name: string, age: number, color: string, sport: string[]) {
|
|
|
|
|
this.name = name;
|
|
|
|
|
this.age = age;
|
|
|
|
|
this.color = color;
|
|
|
|
|
this.sport = sport || [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getAge() {
|
|
|
|
|
return this.age;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setAge(age: number) {
|
|
|
|
|
this.age = age;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addFriend(person: Person) {
|
|
|
|
|
// Si la personne n'est pas déjà dans la liste d'amis
|
|
|
|
|
// et qu'il a pas déjà 5 amis ou plus
|
|
|
|
|
// alors on l'ajoute
|
|
|
|
|
if (!this.friends.includes(person) && this.friends.length < 5 && person.friends.length < 5) {
|
|
|
|
|
this.friends.push(person);
|
|
|
|
|
person.addFriend(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getFriends() {
|
|
|
|
|
return this.friends;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
equals(person: Person) {
|
|
|
|
|
return this.age === person.age &&
|
|
|
|
|
this.color === person.color &&
|
|
|
|
|
this.sportsEquals(person);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sportsEquals(person:Person) {
|
|
|
|
|
return this.sport.length === person.sport.length &&
|
|
|
|
|
this.sport.every(sport => person.sport.includes(sport));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
toString() {
|
|
|
|
|
return `Person(id = ${this.id}, age=${this.age}, color=${this.color}, sport=${this.sport}, friends=${this.friends.length})`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Génère un élément aléatoire d'un tableau
|
|
|
|
|
function getRandomElement(array: any[]) {
|
|
|
|
|
return array[Math.floor(Math.random() * array.length)];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Génère un nombre aléatoire entre min et max
|
|
|
|
|
function getRandomNumber(min: number, max: number) {
|
|
|
|
|
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Génère une personne avec un age, une couleur et une liste de sports
|
|
|
|
|
function generatePerson(possibleNames: string[], possibleSports: string[], existingPeople: Person[]) {
|
|
|
|
|
// Génère un age entre 20 et 100 ans
|
|
|
|
|
const age = getRandomNumber(MIN_AGE, MAX_AGE);
|
|
|
|
|
const color = getRandomElement(COLORS);
|
|
|
|
|
const sports = [];
|
|
|
|
|
let name = "";
|
|
|
|
|
|
|
|
|
|
// Génère un nombre de sports entre 1 et NB_SPORTS
|
|
|
|
|
const nbSports = getRandomNumber(1, NB_SPORTS);
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < nbSports; i++) {
|
|
|
|
|
// Gestion des sports
|
|
|
|
|
// Si il n'y a plus de sports possibles, on reprend la liste de base
|
|
|
|
|
if (possibleSports.length === 0) {
|
|
|
|
|
possibleSports = SPORTS.slice();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Génère un sport aléatoire
|
|
|
|
|
// Si le sport est déjà dans la liste, on recommence
|
|
|
|
|
const sport = getRandomElement(possibleSports);
|
|
|
|
|
if (sports.indexOf(sport) === -1) {
|
|
|
|
|
possibleSports.splice(possibleSports.indexOf(sport), 1);
|
|
|
|
|
sports.push(sport);
|
|
|
|
|
} else {
|
|
|
|
|
i--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Gestion des prénoms
|
|
|
|
|
// Si il n'y a plus de prénoms possibles, on reprend la liste de base
|
|
|
|
|
if (possibleNames.length === 0) {
|
|
|
|
|
possibleNames = NAMES.slice();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Génère un prénom aléatoire et le supprime de la liste de prénom disponible
|
|
|
|
|
name = getRandomElement(possibleNames);
|
|
|
|
|
possibleNames.splice(possibleNames.indexOf(name), 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const newPerson = new Person(name, age, color, sports);
|
|
|
|
|
const edgesCreator = new EdgesCreator()
|
|
|
|
|
|
|
|
|
|
// Vérifie si la personne n'est pas déjà dans la liste
|
|
|
|
|
// Si déjà dans la liste, on recommence
|
|
|
|
|
// if (existingPeople.some(person => person.equals(newPerson))) {
|
|
|
|
|
// return generatePerson(possibleSports, existingPeople);
|
|
|
|
|
// }
|
|
|
|
|
const chooser = new IndiceChooser()
|
|
|
|
|
|
|
|
|
|
return newPerson;
|
|
|
|
|
}
|
|
|
|
|
const indices = Stub.GenerateIndice()
|
|
|
|
|
|
|
|
|
|
function generatePeople(nbPeople: number) {
|
|
|
|
|
const people = [];
|
|
|
|
|
let possibleSports = SPORTS.slice();
|
|
|
|
|
let possibleNames = NAMES.slice();
|
|
|
|
|
const network = NetworkGenerator.GenerateNetwork(30)
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < nbPeople; i++) {
|
|
|
|
|
const person = generatePerson(possibleNames, possibleSports, people);
|
|
|
|
|
person.id += i;
|
|
|
|
|
people.push(person);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return people;
|
|
|
|
|
}
|
|
|
|
|
const rand = Math.floor(Math.random() * 30)
|
|
|
|
|
const person = network.getPersons()[rand]
|
|
|
|
|
|
|
|
|
|
// Ajouter des amis aléatoirement entre une liste de personnes
|
|
|
|
|
function addFriends(people: Person[]) {
|
|
|
|
|
people.forEach(person => {
|
|
|
|
|
// const nbFriends = getRandomNumber(0, people.length - 1);
|
|
|
|
|
const nbFriends = getRandomNumber(1, 5);
|
|
|
|
|
const choosenIndices = chooser.chooseIndice(network, person, indices, 3)
|
|
|
|
|
|
|
|
|
|
edgesCreator.CreateAllEdges(network, person, choosenIndices)
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < nbFriends; i++) {
|
|
|
|
|
let friend = getRandomElement(people);
|
|
|
|
|
|
|
|
|
|
// S'assurer que l'ami généré aléatoirement est différent de la personne
|
|
|
|
|
while (friend === person) {
|
|
|
|
|
friend = getRandomElement(people);
|
|
|
|
|
}
|
|
|
|
|
const graph = GraphCreator.CreateGraph(network)
|
|
|
|
|
|
|
|
|
|
person.addFriend(friend);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
console.log(network)
|
|
|
|
|
console.log(graph)
|
|
|
|
|
|
|
|
|
|
const people = generatePeople(40);
|
|
|
|
|
addFriends(people);
|
|
|
|
|
|
|
|
|
|
const MyGraphComponent = () => {
|
|
|
|
|
useEffect(() => {
|
|
|
|
@ -167,22 +36,8 @@ const MyGraphComponent = () => {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Création du réseau
|
|
|
|
|
const persons: any[] = [];
|
|
|
|
|
const edges: any[] = [];
|
|
|
|
|
people.forEach(person => {
|
|
|
|
|
const visPerson = {id: person.id, label: person.name};
|
|
|
|
|
persons.push(visPerson);
|
|
|
|
|
person.friends.forEach(friend => {
|
|
|
|
|
// Eviter le double sens des relations
|
|
|
|
|
if (edges.some(edge => edge.from === friend.id && edge.to === person.id || edge.from === person.id && edge.to === friend.id)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
edges.push({from: person.id, to: friend.id});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
// Charger les données dans le graph
|
|
|
|
|
const nodes = new DataSet(persons);
|
|
|
|
|
const nodes = new DataSet(graph.nodesPerson);
|
|
|
|
|
|
|
|
|
|
// Configuration des options du Graphe
|
|
|
|
|
const initialOptions = {
|
|
|
|
@ -211,7 +66,7 @@ const MyGraphComponent = () => {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const networkData = { nodes: nodes, edges: edges };
|
|
|
|
|
const networkData = { nodes: nodes, edges: graph.edges };
|
|
|
|
|
const network = new Network(container, networkData, initialOptions);
|
|
|
|
|
|
|
|
|
|
// Gérer le changement entre la physique et le déplacement manuel
|
|
|
|
|