У меня есть код, в котором я пытаюсь реализовать алгоритм GJK (алгоритм для нахождения пересечения двух фигур).
Основной файл gjk.h выглядит так:
#include "Vector.h"
#include "Collision.h"
#include "Simplex.h"
Vector support(IShape a, IShape b, Vector direction){
Vector aFar = a.FarthestPointInDirection(direction);
Vector bFar = b.FarthestPointInDirection(direction);
return *aFar.Sub(bFar);
}
Collision Calculate(IShape a,IShape b){
Simplex simplex = *(new Simplex());
Vector direction = *new Vector(0,1);
Vector initSupportPoint = support(a,b,direction);
simplex.Add(initSupportPoint);
direction = *direction.Invert();
while(direction.null){
Vector supportPoint=support(a,b,direction);
if (supportPoint.Dot(direction)<=0){
return *new Collision(a,b,true);
}
simplex.Add(supportPoint);
direction=simplex.CalculateDirection();
}
return *new Collision(a,b,false);
}
Здесь используется IShape, который является интерфейсом. Он определен в своем файле IShape.h
#ifndef ISHAPE_H
#define ISHAPE_H
class IShape
{
public:
virtual Vector FarthestPointInDirection(Vector direction);
};
#endif
Есть два класса, которые этот интерфейс реализуют. Они находятся в своих файлах:
polygon.h
#ifndef POLYGON_H
#define POLYGON_H
class polygon : public IShape{
public:
vector<Vector> points;
polygon(vector<Vector> points){
this->points=points;
}
virtual Vector FarthestPointInDirection(Vector direction){
int farthestDistance=-2147483647;
Vector farthestPoint = *new Vector(0,0);
for (int point = 0;point<this->points.size();point++){
int distanceInDirection = this->points[point].Dot(direction);
if (distanceInDirection>farthestDistance){
farthestPoint=this->points[point];
farthestDistance=distanceInDirection;
}
}
return farthestPoint;
}
};
#endif
Circle.h:
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle : public IShape
{
public:
Vector center;
int radius;
Circle(int radius,Vector center)
{
this->radius=radius;
this->center=center;
}
virtual Vector FarthestPointInDirection(Vector direction){
float angle = atan2(direction.y,direction.x);
return *new Vector(this->center.x+(this->radius*cos(angle)),
this->center.y+(this->radius*sin(angle)));
}
};
#endif
В файле main.cpp ничего нет, кроме
#include "gjk.h"
То есть функции никакие не вызываются.
Компилятор выдает следующую ошибку:
Как все-таки правильно использовать интерфейсы и что я делаю не так?