Изометрическая проекция в 2-й системе координат

  1. , Когда Вы хотите сохранить широкие символы в Вашей строке. wide зависит от реализации. Значения по умолчанию Visual C++ к 16 битам, если я помню правильно, в то время как значения по умолчанию GCC в зависимости от цели. Это 32 бита длиной здесь. Обратите внимание, что wchar_t (тип широкого символа) не имеет никакого отношения к unicode. Просто гарантируется, что это может сохранить всех членов самого большого набора символов что поддержка внедрения его локалями, и по крайней мере настолько же долго как символ. Вы можете хранилище строки unicode, прекрасные в std::string использование utf-8 кодирование также. Но это не поймет значение unicode кодовых точек. Так str.size() не даст Вам количество логических символов в Вашей строке, но просто сумму символа или wchar_t элементов, сохраненных в этом string/wstring. По этой причине gtk/glib люди обертки C++ разработали Glib::ustring класс, который может обработать utf-8.

    , Если Ваш wchar_t 32 бита длиной, то можно использовать utf-32 в качестве кодирования unicode, и можно сохранить , и дескриптор unicode строки с помощью фиксированного (utf-32 фиксированная длина), кодирование. Это означает Ваш wstring's s.size(), функция будет тогда , возвращают правильную сумму wchar_t элементов и логические символы.

  2. Да, символ всегда по крайней мере 8 битов длиной, что означает, что он может сохранить все значения ASCII.
  3. Да, все главные компиляторы поддерживают его.
5
задан SageAMDP 27 July 2009 в 18:33
поделиться

3 ответа

Что ж, если вы планируете больше заниматься графическим программированием игр, я бы посоветовал хотя бы нацелиться на второстепенное по математике.

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

В любом случае (и некоторые из них, если не многие из них, могут быть пересмотрены для вас): по сути, то, что делает так называемое «графическое преобразование», представляет собой буквальное преобразование точек посредством некоторой комбинации перемещений, вращений, масштабов, отражений и сдвигов; Большинство из этих концепций, связанных с двумерной системой координат, должно быть вам знакомо, и их можно довольно просто выразить. В следующих примерах я буду использовать отрезок линии, определяемый двумя точками, выраженными в форме «(x1, y1), (x2, y2)»; вы можете нарисовать их на миллиметровой бумаге или чем-то еще для облегчения понимания.

Примеры: перевод будет идти от (0, 0), (1, 0) до (1, 0), (2 , 0) или от (0, 0), (1, 0) до (0, 1), (1, 1); поворот будет идти от (0, 0), (1, 0) до (0, 0), (0, 1); масштабирование будет идти от (0, 0), (1, 0) до (0, 0), (2, 0) или от (0, 0), (1, 0) до (0, 0), (0,5 , 0).

Используя более упрощенные обозначения, перенос одной точки (x, y) может быть выражен как (x + a, y + b), где a и b - константы в диапазоне всех действительных числа. Вращение будет (x * cos (theta), y * sin (theta)), где «theta» - это угловое значение, на которое вы хотите повернуть, а масштаб будет (a x, b y), где a - масштабный коэффициент по оси x, а b - масштабный коэффициент по оси y. (Единый масштаб - это масштаб с равными масштабными коэффициентами для обеих осей, и поэтому он будет (a x, a y).)

Комбинирование простых преобразований позволяет вам перемещать объекты в значительной степени, но вы хотите, и самый простой способ комбинировать простые преобразования - использовать умножение матриц .

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

http://en.wikipedia.org/wiki/Transformation_ (геометрия)
http://en.wikipedia.org/wiki/Transformation_matrix
http://en.wikipedia.org/wiki/Euclidean_vector (Вам может понадобиться, а может и нет.)

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

Надеюсь, это вам немного помогло; это может быть не тот немедленный ответ, которого вы, вероятно, хотите, но если вы готовы потратить время и усилия, чтобы научить себя (или вас научили, если вы все же решите взять уроки где-нибудь (в конце концов, самообучение не для всех)), как работать с матрицами, преобразованиями матриц и т.п., вы, вероятно, поймете, что пытаетесь сделать немного больше.

РЕДАКТИРОВАТЬ: Конечно, если у вас уже определены графические преобразования и вам не нужно беспокоиться о них самостоятельно, то очень легко переместить точку на любой плоскости, параллельной любой оси в трехмерном пространстве. По сути, в памяти точки лежат (или должны лежать) в "нормальном состоянии", выражаясь вашим словом, в трехмерной декартовой системе координат. Предполагая, что плоскость, вдоль которой происходит движение, является плоскостью z = 0, а координаты точки сохранены в формате, эквивалентном (x, y, z), вы можете перемещать точку просто, скажем, (x + 10, y, 0) или (x, y + 10, 0); если у вас есть точка, которая находится на более высокой плоскости, чем другие, вы просто устанавливаете более высокое значение для z (а если у вас есть точка на более низкой плоскости, вы устанавливаете значение для z <0). После того, как вы применили движение к самой точке, вы можете применить графическое преобразование к среде, если вы этого еще не сделали, что настроит его для правильного отображения на вашем устройстве вывода (в вашем случае на iPhone). Применение преобразования немного сложнее, но если у вас есть заранее написанный метод для этого, то все готово.

Это уже сделано, что настраивает его для правильного отображения на вашем устройстве вывода (в вашем случае на iPhone). Применение преобразования немного сложнее, но если у вас есть заранее написанный метод для этого, то все готово.

Это уже сделано, что настраивает его для правильного отображения на вашем устройстве вывода (в вашем случае на iPhone). Применение преобразования немного сложнее, но если у вас есть заранее написанный метод для этого, то все готово.

12
ответ дан 18 December 2019 в 09:52
поделиться

Если вы работаете с Core Animation, вы можете легко сделать это с помощью правильного применения трехмерного преобразования. Создание CATransform3D с использованием кода, подобного следующему:

CATransform3D perspectiveRotation = CATransform3DMakeRotation(-40.0 * M_PI / 180.0, 0.0, 1.0, 0.0);
perspectiveRotation = CATransform3DRotate(perspectiveRotation, -55.0 * M_PI / 180.0, perspectiveRotation.m11, perspectiveRotation.m21, perspectiveRotation.m31);

, а затем применение этого преобразования с использованием соответствующего свойства на вашем CALayer (или поддерживающем слое UIView) наклонит слой в 3-D. Перемещение подслоев на этом слое по-прежнему будет происходить в обычном декартовом пространстве координат, но у вас будет изометрическая перспектива на этих подслоях.

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

4
ответ дан 18 December 2019 в 09:52
поделиться

Вы должны разработать ваше изометрическое преобразование; то есть у вас должно быть преобразование, которое говорит вам от исходных координат, где что-то находится на изометрической проекции. Например, изометрическая проекция может иметь вид ((isox = x + (y / 2)), (isoy = y)) (просто дерьмовый пример). Из этого уравнения вы можете взять свои «нормальные» координаты x и y и вычислить по ним свою проекцию.

1
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: