/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package hr.fer.zemris.vhdllab.applets.schema2.gui.canvas; import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaWire; import hr.fer.zemris.vhdllab.applets.editor.schema2.misc.Caseless; import hr.fer.zemris.vhdllab.applets.editor.schema2.misc.WireSegment; import hr.fer.zemris.vhdllab.applets.editor.schema2.misc.XYLocation; import java.awt.Color; import java.awt.Graphics2D; import java.util.List; public class CriticalPoint { public static int MAX_RADIUS = 20; public static final int ON_COMPONENT_PLUG = 0; public static final int ON_WIRE_PLUG = 1; private int x; private int y; private int type = 0; private Caseless name = null; private Caseless portName = null; public CriticalPoint(int x, int y) { this.x = x; this.y = y; } public CriticalPoint(int x, int y, int type, Caseless name, Caseless portName) { this(x,y); this.name=name; this.type=type; this.portName=portName; } public CriticalPoint(ISchemaWire wire, int x2, int y2) { // TODO jeli algoritam dobar this.x = x2; this.y = y2; name=wire.getName(); type = CriticalPoint.ON_WIRE_PLUG; findLocationOnPlug(wire, x2,y2); } public void draw(Graphics2D g,int radius){ Color cl = g.getColor(); g.setColor(type == ON_COMPONENT_PLUG? CanvasColorProvider.CRITICAL_PORT: CanvasColorProvider.CRITICAL_WIRE); g.drawOval(x-radius/2, y-radius/2, radius, radius); g.setColor(cl); } public Caseless getName() { return name; } public void setName(Caseless name) { this.name = name; } public int getType() { return type; } public void setType(int type) { this.type = type; } public Caseless getPortName() { return portName; } public int getX() { return x; } public int getY() { return y; } private void findLocationOnPlug(ISchemaWire wire, int x, int y) { List<WireSegment> segmentList = wire.getSegments(); int distance = 10; WireSegment clSegment = null; for(WireSegment segment:segmentList){ if(segment.calcDist(x, y)<distance) { distance = segment.calcDist(x, y); clSegment = segment; } } if (clSegment == null) { return; } if(clSegment.isVertical()){ this.x = clSegment.getStart().x; }else{ this.y = clSegment.getStart().y; } if(calculateDistance(clSegment.getStart())<10){ this.x = clSegment.getStart().getX(); this.y = clSegment.getStart().getY(); } if(calculateDistance(clSegment.getEnd())<10){ this.x = clSegment.getEnd().getX(); this.y = clSegment.getEnd().getY(); } List<XYLocation> nodeLocations = wire.getNodes(); for(XYLocation xy:nodeLocations){ if(calculateDistance(xy)<10){ this.x = xy.x; this.y = xy.y; } } } private double calculateDistance(XYLocation xy) { return Math.sqrt((x-xy.x)*(x-xy.x)+(y-xy.y)*(y-xy.y)); } }