2017-01-26 15 views
1

У меня есть простой svg с тремя дорожками: красный, синий и желтый. Я хочу: масштабировать все фигуры (например, 0,3) и поворачивать только красный + синий (например, 90 градусов). Точка вращения должна быть средней красной дорожкой. После этих операций я хочу, чтобы желтая форма имела расстояние до красной дорожки, расстояние оригинала до 0,3.Svg простые преобразования

Моя попытка была:

  1. вычислить середину красной дорожке;
  2. перевести в начало координат (0,0), по переведенный с (-redCenterPoint.x, - redCenterPoint.y)
  3. Scale красный путь от 0,3
  4. двигаться назад красный путь от перевода (redCenterPoint.x, redCenterPoint .y)
  5. повторите то же самое для синего и желтого, вычисляя blueCenter, yellowCenter

Мой вопрос: Как я могу сохранить первоначальную структуру изображения, но масштабируется на 0,3 и повернуть на 90? - синий путь для контакта с красным дорожкой и желтый, чтобы иметь исходное расстояние, масштабируемое на 0,3.

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

enter image description here

Файл .SVG:

<g 
inkscape:label="Layer 1" 
inkscape:groupmode="layer" 
id="layer1"> 
<path 
    style="opacity:1;fill:#ff0000" 
    d="m 146.98669,417.50473 561.36408,0 0,206.40686 -561.36408,0 z" 
    id="red" 
    inkscape:label="#table" /> 
<path 
    style="opacity:1;fill:#0000ff" 
    d="m 641.11218,339.32031 65.67491,0 0,82.87548 -65.67491,0 z" 
    id="blue" /> 
<path 
    style="opacity:1;fill:#ffff00" 
    d="m 764.69525,515.63883 55.28473,-55.28473 46.43917,46.43918 -55.28473,55.28472 z" 
    id="yellow" 
    inkscape:connector-curvature="0" 
    inkscape:label="#yellow" /> 

код в Дельфах, используя компонент RiverSoft для Предоставление SVG:

redBounds: TSVGRect; 
redCenterPoint: TPointF; 
redMatrix: TSVGMatrix 

redBounds := (svgDoc.SVG.AllItems['red'] as TSVGGraphicElement).BoundsRect; 

redCenterPoint.x := bDiamond.Left + (bDiamond.Width)/2; 
redCenterPoint.y := bDiamond.Top + (bDiamond.Height)/2; 

redMatrix := CreateTranslateRSMatrix(-redCenterPoint.x, -redCenterPoint.y); 

    redMatrix := RSMatrixMultiply(redMatrix, 
    CreateRotationRSMatrix(TPoint(0,0), DegToRad(90))); 

    redMatrix := RSMatrixMultiply(redMatrix, 
    CreateScaleRSMatrix(0.3, 0.3)); 

    redMatrix := RSMatrixMultiply(redMatrix, 
    CreateTranslateRSMatrix(redCenterPoint.x, redCenterPoint.y)); 

    (svgDoc.SVG.AllItems['red'] as TSVGGraphicElement) 
     .Matrix := mainMatrix; 
+0

Это мой вопрос: я хочу, чтобы после этих преобразований сохранилось исходное изображение: синий путь, чтобы быть на связи с красным дорожкой и желтым, чтобы иметь исходное расстояние, масштабируемое на 0,3. Как я могу контролировать положение синего пути после преобразования aply. Я хочу быть тем же изображением, что и попрошайничество, но масштабируется на 0,3. – Geanni

+0

Я не понимаю, что вы действительно хотите сделать. Поворот? Масштаб? «сохранить исходное изображение»? Не могли бы вы показать изображение желаемого результата? – MBo

+0

Хотя мне сложно понять, чего вы хотите достичь, похоже, что вы хотите сгруппировать синие и красные и повернуть, что на собственном уровне, масштабируя общую группу, которая содержит все три пути вместе, но я не могу быть уверенным. Это особенно бит о желтом пути, о котором я не знаю. Как MBo - вы могли бы создать чертеж. –

ответ

0

Что вы делаете, сохраняя постоянным для каждой отдельной формы центра. Это не то, что вы хотите сделать. Вы хотите, чтобы центр всей формы был постоянным. Это то, что вы делаете во второй попытке, когда вы применяете красный центр ко всем 3 формам, поэтому он выглядит лучше. Возможно, вам захочется выбрать другой центр, и для этого есть разные алгоритмы, или даже оставить исходное место там, где оно есть (не мешая вообще перемещать центр). Но вы должны применить тот же центр, что бы вы ни выбрали, ко всем формам для достижения того, что вы хотите, и это относится также к вращению (хотя в вашем случае вы применяете только поворот к двум формам). Центр вращения, однако, не обязательно должен быть таким же, как центр масштабирования.

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