2.12.2021, 9:00 - 11:00: Due to updates GitLab may be unavailable for some minutes between 09:00 and 11:00.

Commit 7ecc4813 authored by Benedikt Zoennchen's avatar Benedikt Zoennchen
Browse files

resolve merge conflict.

parents 4846b945 145f1026
Pipeline #59614 passed with stage
in 48 seconds
......@@ -145,7 +145,7 @@ public class ScenarioElementView extends JPanel implements ISelectScenarioElemen
} else {
try {
Attributes attributes = StateJsonConverter.deserializeScenarioElementType(json, element.getType());
ReflectionAttributeModifier.setAttributes(element, attributes);
element.setAttributes(attributes); // Replaces previous AttributeModifier.setAttributes (see #91)
ScenarioPanel.removeJsonParsingErrorMsg();
ProjectView.getMainWindow().refreshScenarioNames();
jsonValidIndicator.setValid();
......@@ -186,8 +186,8 @@ public class ScenarioElementView extends JPanel implements ISelectScenarioElemen
} else if (scenarioElement instanceof Pedestrian) {
this.txtrTextfiletextarea.setText(StateJsonConverter.serializeObject(scenarioElement));
} else {
this.txtrTextfiletextarea.setText(StateJsonConverter
.serializeObject(ReflectionAttributeModifier.getAttributes(scenarioElement)));
this.txtrTextfiletextarea.setText(StateJsonConverter
.serializeObject(scenarioElement.getAttributes()));
}
}
}
......
......@@ -3,18 +3,20 @@ package org.vadere.gui.topographycreator.control;
import java.lang.reflect.Field;
import org.vadere.gui.topographycreator.model.AgentWrapper;
import org.vadere.simulator.projects.Scenario;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.AttributesEmbedShape;
import org.vadere.state.scenario.ScenarioElement;
import org.vadere.util.geometry.shapes.VPoint;
import org.vadere.util.geometry.shapes.VShape;
/**
* Setter and getter implementation to modify Attributes. This class uses use of reflection.
* Setter implementation to modify shape of Attributes.
* Do not use this class outside of the topographycreator package, or even not outside this
* control-package!
*
*
*/
public class ReflectionAttributeModifier {
public class AttributeModifier {
/**
* Sets the shape to the attributes of an topography element. Use this method only in the
* control!
......@@ -24,19 +26,15 @@ public class ReflectionAttributeModifier {
*/
static void setShapeToAttributes(final ScenarioElement element, final VShape shape) {
try {
Field field;
if (element instanceof AgentWrapper) {
double x = shape.getBounds2D().getCenterX();
double y = shape.getBounds2D().getCenterY();
((AgentWrapper) element).getAgentInitialStore().setPosition(new VPoint(x, y));
} else {
Attributes attributes =
org.vadere.simulator.entrypoints.ReflectionAttributeModifier.getAttributes(element);
field = attributes.getClass().getDeclaredField("shape");
field.setAccessible(true);
field.set(attributes, shape);
AttributesEmbedShape attributes = (AttributesEmbedShape) element.getAttributes();
attributes.setShape(shape);
}
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
} catch (ClassCastException e) {
e.printStackTrace();
}
}
......
......@@ -26,14 +26,14 @@ public class EditUpdateElementShape extends AbstractUndoableEdit {
@Override
public void undo() throws CannotUndoException {
ReflectionAttributeModifier.setShapeToAttributes(element, oldShape);
AttributeModifier.setShapeToAttributes(element, oldShape);
panelModel.setSelectedElement(element);
panelModel.notifyObservers();
}
@Override
public void redo() throws CannotRedoException {
ReflectionAttributeModifier.setShapeToAttributes(element, newShape);
AttributeModifier.setShapeToAttributes(element, newShape);
panelModel.setSelectedElement(element);
panelModel.notifyObservers();
}
......
......@@ -77,7 +77,7 @@ public class SelectElementMode extends DefaultSelectionMode {
VShape newShape =
panelModel.translate(new Point(e.getPoint().x - startPoint.x, e.getPoint().y - startPoint.y));
ReflectionAttributeModifier.setShapeToAttributes(element, newShape);
AttributeModifier.setShapeToAttributes(element, newShape);
// tell the panelModel that the selected element has changed!
panelModel.setSelectedElement(element);
......
......@@ -71,6 +71,11 @@ public final class AgentWrapper extends ScenarioElement {
return agent.getAttributes();
}
@Override
public void setAttributes(Attributes attributes){
this.agent.setAttributes(attributes);
}
@Override
public AgentWrapper clone() {
return new AgentWrapper((Agent) agent.clone());
......
......@@ -184,8 +184,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -184,8 +184,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -184,8 +184,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -184,8 +184,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -184,8 +184,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -184,8 +184,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -184,8 +184,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -103,7 +103,7 @@
"shape" : {
"x" : 1.0,
"y" : 0.0,
"width" : 0.9,
"width" : 1.0,
"height" : 20.0,
"type" : "RECTANGLE"
},
......@@ -157,8 +157,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -103,7 +103,7 @@
"shape" : {
"x" : 1.0,
"y" : 0.0,
"width" : 0.9,
"width" : 1.0,
"height" : 20.0,
"type" : "RECTANGLE"
},
......@@ -157,8 +157,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -103,7 +103,7 @@
"shape" : {
"x" : 1.0,
"y" : 0.0,
"width" : 0.9,
"width" : 1.0,
"height" : 20.0,
"type" : "RECTANGLE"
},
......@@ -157,8 +157,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -157,8 +157,8 @@
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 50.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : false,
"spawnAtRandomPositions" : true,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
......
......@@ -252,7 +252,12 @@ public class ScenarioBuilder {
AttributesBuilder<Attributes> attBuilder = new AttributesBuilder<>(element.getAttributes());
attBuilder.setField(fieldName, value);
E clone = (E) element.clone();
reflectionAttributeModifier.setAttributes(clone, attBuilder.build());
//NOTE see issue #91:
//This class is not tested - revert change by uncommenting reflextion and comment in
//clone.setAttributes
//reflectionAttributeModifier.setAttributes(clone, attBuilder.build());
clone.setAttributes(attBuilder.build());
return clone;
}
......
......@@ -18,6 +18,9 @@ import org.vadere.util.geometry.Vector2D;
import org.vadere.util.geometry.shapes.VCircle;
import org.vadere.util.geometry.shapes.VPoint;
// This potential is explained in seitz-2015 (The effect of stepping on pedestrians trajectories)
// p. 596, eq. 1
public class PotentialFieldPedestrianCompact implements PotentialFieldAgent {
class DistanceComparator implements Comparator<Agent> {
......
......@@ -19,12 +19,15 @@ import org.vadere.util.geometry.shapes.VCircle;
import org.vadere.util.geometry.shapes.VPoint;
import org.vadere.util.math.MathUtil;
// Implementation of the soft shell repulsive potential of pedestrians according to sivers-2016b.
// page 46, eq. 4.1
public class PotentialFieldPedestrianCompactSoftshell implements PotentialFieldAgent {
private AttributesPotentialCompactSoftshell attributes;
private double intimateWidth;
private double personalWidth;
private double height;
private double intimateWidth; // radius of intimate zone \delta_{int}
private double personalWidth; // radius of personal width \delta_{per}
private double height; // intensity of repulsion \mu_p
public PotentialFieldPedestrianCompactSoftshell() {}
......@@ -49,26 +52,29 @@ public class PotentialFieldPedestrianCompactSoftshell implements PotentialFieldA
public double getAgentPotential(VPoint pos, Agent pedestrian,
Agent otherPedestrian) {
double radii = pedestrian.getRadius() + otherPedestrian.getRadius();
double radii = pedestrian.getRadius() + otherPedestrian.getRadius(); // 2* r_p (sivers-2016b)
double potential = 0;
double distnaceSq = otherPedestrian.getPosition().distanceSq(pos);
double distanceSq = otherPedestrian.getPosition().distanceSq(pos);
double maxDistanceSq = (Math.max(personalWidth, intimateWidth) + radii) * (Math.max(personalWidth, intimateWidth) + radii);
if(distnaceSq < maxDistanceSq) {
double distance = otherPedestrian.getPosition().distance(pos);
if(distanceSq < maxDistanceSq) {
double distance = otherPedestrian.getPosition().distance(pos); // Euclidean distance d_j(x) between agent j and position x
int intPower = this.attributes.getIntimateSpacePower();
int perPower = this.attributes.getPersonalSpacePower();
double factor = this.attributes.getIntimateSpaceFactor();
int intPower = this.attributes.getIntimateSpacePower(); // b_p
int perPower = this.attributes.getPersonalSpacePower(); // not defined in sivers-2016b (perPower = 1)
double factor = this.attributes.getIntimateSpaceFactor(); // a_p
if (distance < personalWidth + radii) {
// implementation differs from sivers-2016b here: \delta_{per} + r_p (note: radii = 2*r_p)
potential += this.height * Math.exp(4 / (Math.pow(distance / (personalWidth + radii), (2 * perPower)) - 1));
}
if (distance < this.intimateWidth + radii) {
// implementation differs from sivers-2016b here: \delta_{int} + r_p (note: radii = 2*r_p)
potential += this.height / factor
* Math.exp(4 / (Math.pow(distance / (this.intimateWidth + radii), (2 * intPower)) - 1));
}
if (distance < radii) {
// implementations differs from sivers-2016b here : Math.power(distance / (radii),2)
potential += 1000 * Math.exp(1 / (Math.pow(distance / radii, 4) - 1));
}
}
......@@ -94,7 +100,7 @@ public class PotentialFieldPedestrianCompactSoftshell implements PotentialFieldA
public Vector2D getAgentPotentialGradient(VPoint pos,
Vector2D velocity, Agent pedestrian,
Collection<? extends Agent> otherPedestrians) {
throw new UnsupportedOperationException("not jet implemented.");
throw new UnsupportedOperationException("not yet implemented.");
/*double epsilon = 0.001;
double dx = 0;
double dy = 0;
......
package org.vadere.state.attributes;
import org.vadere.util.geometry.shapes.VShape;
/**
* Abstract Base Class for {@link Attributes} that also consist of a {@link VShape}. The shape can be changed and
* 'undo' and 'redo' operations can be carried out in EditUpdateElementShape in package
* org.vadere.gui.topographycreator.control.
*/
public abstract class AttributesEmbedShape extends Attributes {
public abstract void setShape(VShape shape);
public abstract VShape getShape();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment