Круг действительно плохой парень. Так что хороший способ - избежать истинного круга, если сможете. Если вы делаете проверку на столкновение в играх, вы можете пойти с некоторыми упрощениями и иметь только 3 продукта-точки и несколько сравнений.
Я называю эту «жирную точку» или «тонкий круг». своего рода эллипс с нулевым радиусом в направлении, параллельном отрезку. но полный радиус в направлении, перпендикулярном сегменту
. Во-первых, я бы рассмотрел переименование и переключение системы координат, чтобы избежать чрезмерных данных:
s0s1 = B-A;
s0qp = C-A;
rSqr = r*r;
Во-вторых, индекс h в hvec2f означает вектор должен поддерживать горизонтальные операции, такие как точка () / det (). Это означает, что его компоненты должны быть помещены в отдельные регистры xmm, чтобы избежать перетасовки / hadd'ing / hsub'ing. И здесь мы идем с самой совершенной версией самого простого обнаружения столкновения для 2D-игры:
bool fat_point_collides_segment(const hvec2f& s0qp, const hvec2f& s0s1, const float& rSqr) {
auto a = dot(s0s1, s0s1);
//if( a != 0 ) // if you haven't zero-length segments omit this, as it would save you 1 _mm_comineq_ss() instruction and 1 memory fetch
{
auto b = dot(s0s1, s0qp);
auto t = b / a; // length of projection of s0qp onto s0s1
//std::cout << "t = " << t << "\n";
if ((t >= 0) && (t <= 1)) //
{
auto c = dot(s0qp, s0qp);
auto r2 = c - a * t * t;
return (r2 <= rSqr); // true if collides
}
}
return false;
}
Я сомневаюсь, что вы сможете ее оптимизировать дальше. Я использую его для обнаружения столкновений с авто-гоночными столкновениями с нейронными сетями, для обработки миллионных шагов итерации.
Когда вы создаете базу данных в joava, вам также необходимо включить протокол BOLT. Вы можете посмотреть документацию: https://neo4j.com/docs/java-reference/current/tutorials-java-embedded/#tutorials-java-embedded-bolt
Сначала импортируйте банку болтов в ваш проект
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-bolt</artifactId>
<version>3.4.0</version>
</dependency>
И затем настройте базу данных, чтобы включить протокол болтов:
GraphDatabaseSettings.BoltConnector bolt = GraphDatabaseSettings.boltConnector( "0" );
GraphDatabaseService graphDb = new GraphDatabaseFactory()
.newEmbeddedDatabaseBuilder( DB_PATH )
.setConfig( bolt.type, "BOLT" )
.setConfig( bolt.enabled, "true" )
.setConfig( bolt.address, "localhost:7687" )
.newGraphDatabase();
В этот момент вы можете взять neo4j настольную версию, а также создать удаленное соединение и использовать браузер.