Я должен задержать от базы данных JSON документы, которые не основаны на стандартном объекте.
Есть ли способ использовать.NET для "десериализовывания" этих документов в Списки и Словари элементарных объектов (строка, интервал, bool, и т.д....)
Какая-либо библиотека, которая может сделать это в обоих направлениях?
В .NET 3.5 Framework вы можете использовать System.Web.Script.Serialization.JavaScriptSerializer. Использование метода Deserialize вернет объект, который вы можете привести к типу Dictionary или Object[] в зависимости от того, что находится в строке JSON.
Я написал подпрограмму прицеливания для xtank некоторое время назад. Я постараюсь выложить, как я это сделал.
Отказ от ответственности: Я, возможно, допустил одну или несколько глупых ошибок в любом месте здесь; Я просто пытаюсь восстановить рассуждения своими ржавыми математическими навыками. Однако сначала я нарежу на погоню, так как это программирование вопросов и ответов вместо класса математики: -)
Это сводится к решению квадратичного уравнения вида:
a * sqr(x) + b * x + c == 0
Обратите внимание, что под sqr
я имею в виду квадрат, в отличие от квадратного корня. Используйте следующие значения:
a := sqr(target.velocityX) + sqr(target.velocityY) - sqr(projectile_speed)
b := 2 * (target.velocityX * (target.startX - cannon.X)
+ target.velocityY * (target.startY - cannon.Y))
c := sqr(target.startX - cannon.X) + sqr(target.startY - cannon.Y)
Теперь мы можем посмотреть на дискриминант, чтобы определить, есть ли у нас возможное решение.
disc := sqr(b) - 4 * a * c
Если дискриминант меньше 0, забудьте о поражении цели - ваш снаряд никогда не сможет попасть туда вовремя. В противном случае рассмотрим два возможных решения:
t1 := (-b + sqrt(disc)) / (2 * a)
t2 := (-b - sqrt(disc)) / (2 * a)
Обратите внимание, что если диск = 0
, то t1
и t2
равны.
Если нет других соображений, таких как вмешательство препятствий, просто выберите меньшее положительное значение. (Отрицательные значения t потребуют выстрела назад во время использования!)
Подставьте выбранное значение t
обратно в уравнения положения цели, чтобы получить координаты ведущей точки, на которую вы должны наводиться:
aim.X := t * target.velocityX + target.startX
aim.Y := t * target.velocityY + target.startY
В момент T снаряд должен быть (евклидовым) расстоянием от пушки, равным прошедшему Это дает уравнение для окружности, параметрическое за прошедшее время.
sqr(projectile.X - cannon.X) + sqr(projectile.Y - cannon.Y)
== sqr(t * projectile_speed)
Аналогично, в момент времени Т цель двигалась вдоль своего вектора на время, умноженное на ее скорость:
target.X == t * target.velocityX + target.startX
target.Y == t * target.velocityY + target.startY
Снаряд может поразить цель, когда его расстояние от пушки совпадает с расстоянием снаряда.
sqr(projectile.X - cannon.X) + sqr(projectile.Y - cannon.Y)
== sqr(target.X - cannon.X) + sqr(target.Y - cannon.Y)
Замечательно! Замена выражений на целевые. Х и цель. Y дает
sqr(projectile.X - cannon.X) + sqr(projectile.Y - cannon.Y)
== sqr((t * target.velocityX + target.startX) - cannon.X)
+ sqr((t * target.velocityY + target.startY) - cannon.Y)
Подстановка другой стороны уравнения дает следующее:
sqr(t * projectile_speed)
== sqr((t * target.velocityX + target.startX) - cannon.X)
+ sqr((t * target.velocityY + target.startY) - cannon.Y)
... вычитание sqr (t * projectile_speed)
с обеих сторон и его разворот:
sqr((t * target.velocityX) + (target.startX - cannon.X))
+ sqr((t * target.velocityY) + (target.startY - cannon.Y))
- sqr(t * projectile_speed)
== 0
... теперь разрешите результаты возведения в квадрат вложенных выражений...
sqr(target.velocityX) * sqr(t)
+ 2 * t * target.velocityX * (target.startX - cannon.X)
+ sqr(target.startX - cannon.X)
+ sqr(target.velocityY) * sqr(t)
+ 2 * t * target.velocityY * (target.startY - cannon.Y)
+ sqr(target.startY - cannon.Y)
- sqr(projectile_speed) * sqr(t)
== 0
... и группировать подобные термины...
sqr(target.velocityX) * sqr(t)
+ sqr(target.velocityY) * sqr(t)
- sqr(projectile_speed) * sqr(t)
+ 2 * t * target.velocityX * (target.startX - cannon.X)
+ 2 * t * target.velocityY * (target.startY - cannon.Y)
+ sqr(target.startX - cannon.X)
+ sqr(target.startY - cannon.Y)
== 0
... затем объединить их...
(sqr(target.velocityX) + sqr(target.velocityY) - sqr(projectile_speed)) * sqr(t)
+ 2 * (target.velocityX * (target.startX - cannon.X)
+ target.velocityY * (target.startY - cannon.Y)) * t
+ sqr(target.startX - cannon.X) + sqr(target.startY - cannon.Y)
== 0
... получение стандартного квадратичного уравнения в t . Нахождение положительных вещественных нулей этого уравнения даёт (ноль, один или два) возможных места попадания, что можно сделать с помощью квадратичной формулы:
a * sqr(x) + b * x + c == 0
x == (-b ± sqrt(sqr(b) - 4 * a * c)) / (2 * a)
-121--2568939- Its under/app/config/fluctions.php.
-121--5086082- Библиотека Json.NET может сериализоваться в и из словаря < последовательность, последовательность >
, хотя я не знаю, может ли она десериализовать списки словарей. Я пытался понять это, когда столкнулся с этим вопросом:)