private static double rateMatchingPair2(Graph pattern, Graph template, Edge pEdgeA, Edge tEdgeA,
boolean match1To1A, Edge pEdgeB, Edge tEdgeB, boolean match1To1B) {
double averageDistanceInPattern = pattern.getAverageDistanceToCenterInGraph();
double averageDistanceInTemplate = template.getAverageDistanceToCenterInGraph();
Vertex v1pa, v2pa, v1ta, v2ta;
v1pa = pattern.vertices()[pEdgeA.vertex1];
v2pa = pattern.vertices()[pEdgeA.vertex2];
if (match1To1A) {
v1ta = template.vertices()[tEdgeA.vertex1];
v2ta = template.vertices()[tEdgeA.vertex2];
} else {
v1ta = template.vertices()[tEdgeA.vertex2];
v2ta = template.vertices()[tEdgeA.vertex1];
}
Vertex v1pb, v2pb, v1tb, v2tb;
v1pb = pattern.vertices()[pEdgeB.vertex1];
v2pb = pattern.vertices()[pEdgeB.vertex2];
if (match1To1B) {
v1tb = template.vertices()[tEdgeB.vertex1];
v2tb = template.vertices()[tEdgeB.vertex2];
} else {
v1tb = template.vertices()[tEdgeB.vertex2];
v2tb = template.vertices()[tEdgeB.vertex1];
}
double dist_v1pa_v1pb = DistanceHelper.getDistance(v1pa, v1pb);
double dist_v1ta_v1tb = DistanceHelper.getDistance(v1ta, v1tb);
double dist_v1pa_v2pb = DistanceHelper.getDistance(v1pa, v2pb);
double dist_v1ta_v2tb = DistanceHelper.getDistance(v1ta, v2tb);
double dist_v2pa_v1pb = DistanceHelper.getDistance(v2pa, v1pb);
double dist_v2ta_v1tb = DistanceHelper.getDistance(v2ta, v1tb);
double dist_v2pa_v2pb = DistanceHelper.getDistance(v2pa, v2pb);
double dist_v2ta_v2tb = DistanceHelper.getDistance(v2ta, v2tb);
double distanceRatio = 0;
// double maxDistanceToCenter =
// Math.min(pattern.getMaximumVertexDistanceToCenter(), template
// .getMaximumVertexDistanceToCenter())
// / Math.max(averageDistanceInPattern, averageDistanceInTemplate);
double pNorm = pattern.getMaximumVertexDistanceToCenter();
double tNorm = template.getMaximumVertexDistanceToCenter();
double distanceRatio1 = rate(dist_v1pa_v1pb, pNorm, dist_v1ta_v1tb, tNorm);
double distanceRatio2 = rate(dist_v1pa_v2pb, pNorm, dist_v1ta_v2tb, tNorm);
double distanceRatio3 = rate(dist_v2pa_v1pb, pNorm, dist_v2ta_v1tb, tNorm);
double distanceRatio4 = rate(dist_v2pa_v2pb, pNorm, dist_v2ta_v2tb, tNorm);
distanceRatio = Math.min(Math.min(distanceRatio1, distanceRatio2), Math.min(distanceRatio3,
distanceRatio4));
// distanceRatio = (distanceRatio1 + distanceRatio2 + distanceRatio3 +
// distanceRatio4) / 4;
// TODO: umbauen zu Winkel zwischen Kantenmittelpunkten
Point patternCenter = pattern.getCenter();
Point templateCenter = template.getCenter();
double angle_v1pa_v1pb = AngleHelper.getAngle(patternCenter, v1pa.toPoint(), v1pb.toPoint());
double angle_v1ta_v1tb = AngleHelper.getAngle(templateCenter, v1ta.toPoint(), v1tb.toPoint());
double angleDiff1 = AngleHelper.getDiffAngle(angle_v1pa_v1pb, angle_v1ta_v1tb);
double angle_v2pa_v2pb = AngleHelper.getAngle(patternCenter, v2pa.toPoint(), v2pb.toPoint());
double angle_v2ta_v2tb = AngleHelper.getAngle(templateCenter, v2ta.toPoint(), v2tb.toPoint());
double angleDiff2 = AngleHelper.getDiffAngle(angle_v2pa_v2pb, angle_v2ta_v2tb);
double angleRatio = (360d - angleDiff1 - angleDiff2) / 360d;
Point pCenter = pattern.getCenter();
double v1paDistance = DistanceHelper.getDistance(pCenter, v1pa.toPoint()) / averageDistanceInPattern;
double v2paDistance = DistanceHelper.getDistance(pCenter, v2pa.toPoint()) / averageDistanceInPattern;
double v1pbDistance = DistanceHelper.getDistance(pCenter, v1pb.toPoint()) / averageDistanceInPattern;
double v2pbDistance = DistanceHelper.getDistance(pCenter, v2pb.toPoint()) / averageDistanceInPattern;
Point tCenter = template.getCenter();
double v1taDistance = DistanceHelper.getDistance(tCenter, v1ta.toPoint()) / averageDistanceInTemplate;
double v2taDistance = DistanceHelper.getDistance(tCenter, v2ta.toPoint()) / averageDistanceInTemplate;