AndreTrollip Ответов: 1

Определить высшую точку столкновения сферы и прямоугольников


У меня есть 2D-матрица высот, представляющая собой "пол".

Пол состоит из одинаковых по размеру, выровненных по оси прямоугольников, параллельных плоскости XY, на разной высоте (z). Я представляю пол с помощью 2D-матрицы (Matrix[x, y]), такой, что z каждого реактанга является элементом матрицы в точке x, y. Верхний левый угол прямоугольника определяется x и y. Нижний правый угол прямоугольника определяется x + cellWidth и y + cellHeight.

У меня тоже есть сфера. Мне нужно определить первую точку (как центр сферы), в которой сфера сталкивается с любым из прямоугольников, когда сфера опускается на пол. Сфера всегда будет опускаться в центр прямоугольника.

Доступ к матричным элементам можно получить с помощью Matrix[x,y], которая вернет высоту прямоугольника в точке x, y в виде десятичной дроби.

GetFootprintFromTopView-это просто для того, чтобы я мог закрепиться на затронутом "пространстве пола" вместо того, чтобы проверять все прямоугольники пола.

private decimal sphereDiameter;

decimal DetermineCollisionHeightAt(int x, int y, Matrix heights, decimal cellWidth, decimal cellHeight)
{
    var footprintMatrix = GetFootprintFromTopView();

    // ???
}

Matrix GetFootprintFromTopViewAt(int x, int y, Matrix heights, decimal cellWidth, decimal cellLength)
{
    var heightMapLeft = 0;
    var heightMapRight = heights.Width - 1;
    var heightMapTop = 0;
    var heightMapBottom = heights.Length - 1;

    var diameter = sphereDiameter;
    var radius = diameter / 2;
    var centerX = (x * cellWidth) + (cellWidth / 2);
    var centerY = (y * cellLength) + (cellLength / 2);

    Matrix subMatrixToReturn = null;

    // ???

    return subMatrixToReturn;
}


Что я уже пробовал:

Проблема в том, что я понятия не имею, как к этому подойти. Вышеприведенные методы - это то, что у меня есть до сих пор.

CPallini

Я вас не понимаю: у Пола есть высота, это хорошо. Вот сфера падает, это хорошо. Какова роль кубиков?

AndreTrollip

Извини, что я должен был выразиться яснее. Позвольте мне устранить кубическую путаницу. Пол состоит из прямоугольников одинакового размера, параллельных плоскости XY, на разной высоте (z). Я представляю пол с помощью 2D-матрицы (Matrix[x, y]), такой, что z каждого реактанга является элементом в точке x, y. Верхний левый угол прямоугольника определяется x - (cellWidth / 2) и y - (cellHeight / 2). Нижний правый угол прямоугольника определяется x + (cellwidth / 2) и y + (cellHeight / 2)

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

AndreTrollip

Сделано. Спасибо.

Patrice T

Это не проблема программирования, это базовая геометрия.
В чем ваша проблема с вычислением расстояния между трехмерной точкой и сферой ?

Simon_Whale

Лично я думаю, что в этом деле все еще не хватает многих деталей, поскольку мы можем сделать множество предположений. Как работает сфера? растет ли она? она движется? если он движется, есть ли закономерность?

AndreTrollip

На самом деле ppolymorphe был на 100% прав. Я разместил свой вопрос на math. stackexchange и получил решение в течение нескольких минут. Программирование было легким, как только я понял математику.

1 Ответов

Рейтинг:
8

OriginalGriff

Мы не делаем домашнее задание: оно задано не просто так. Она существует для того, чтобы вы думали о том, что вам сказали, и пытались понять это. Он также существует для того, чтобы ваш наставник мог определить области, в которых вы слабы, и сосредоточить больше внимания на корректирующих действиях.
Так что поезжайте, проведите какое-нибудь исследование, подумайте: но просто выложить минимальный код и"???", где происходит вся работа, - это вовсе не "пытаться сделать это самостоятельно".

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете!

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!


OriginalGriff

Так что же вы сделали, чтобы решить эту проблему?

OriginalGriff

Ах милый... Лучше бы ты этого не говорил.
Пожалуйста, не употребляйте оскорбительных выражений: вы здесь достаточно долго, чтобы знать, что это запрещено.