FMX.Controls单元 中图形矩阵变换
procedure TControl.DoMatrixChanged(Sender: TObject);
var
TranslateMatrix, ScaleMatrix, RotMatrix: TMatrix;
M1, M2: TMatrix;
begin
if (not FInPaintTo) and not IsUpdating then
Repaint;
if SameValue(FScale.X, 1.0, TEpsilon.Scale) and SameValue(FScale.Y, 1.0, TEpsilon.Scale) and SameValue(FRotationAngle, 0.0, TEpsilon.Scale) then
begin
if (FParentControl <> nil) and not FParentControl.FSimpleTransform then
FSimpleTransform := False
else
FSimpleTransform := True;
end
else
FSimpleTransform := False;
if not FSimpleTransform then
begin
if not SameValue(FRotationAngle, 0.0, TEpsilon.Scale) then
begin
// scale
ScaleMatrix := TMatrix.Identity;
ScaleMatrix.m11 := FScale.X;
ScaleMatrix.m22 := FScale.Y;
FLocalMatrix := ScaleMatrix;
// rotation
if FRotationAngle <> 0 then
begin
M1 := TMatrix.Identity;
M1.m31 := -FRotationCenter.X * FSize.Width * FScale.X;
M1.m32 := -FRotationCenter.Y * FSize.Height * FScale.Y;
M2 := TMatrix.Identity;
M2.m31 := FRotationCenter.X * FSize.Width * FScale.X;
M2.m32 := FRotationCenter.Y * FSize.Height * FScale.Y;
RotMatrix := M1 * (TMatrix.CreateRotation(DegToRad(FRotationAngle)) * M2);
FLocalMatrix := FLocalMatrix * RotMatrix;
end;
// translate
TranslateMatrix := TMatrix.Identity;
TranslateMatrix.m31 := FPosition.X;
TranslateMatrix.m32 := FPosition.Y;
FLocalMatrix := FLocalMatrix * TranslateMatrix;
end
else
begin
FLocalMatrix := TMatrix.Identity;
FLocalMatrix.m31 := FPosition.X;
FLocalMatrix.m32 := FPosition.Y;
FLocalMatrix.m11 := FScale.X;
FLocalMatrix.m22 := FScale.Y;
end;
end
else
begin
FLocalMatrix := TMatrix.Identity;
FLocalMatrix.m31 := FPosition.X;
FLocalMatrix.m32 := FPosition.Y;
end;
RecalcAbsolute;
RecalcUpdateRect;
if HasDisablePaintEffect then
UpdateEffects;
if Visible and (ParentContent <> nil) then
ParentContent.Changed;
if not FAnchorMove then
begin
UpdateExplicitBounds;
UpdateAnchorRules(True);
end;
if (not FInPaintTo) and not IsUpdating then
Repaint;
end;
procedure TControl.DoMatrixChanged(Sender: TObject);
var
TranslateMatrix, ScaleMatrix, RotMatrix: TMatrix;
M1, M2: TMatrix;
begin
if (not FInPaintTo) and not IsUpdating then
Repaint;
if SameValue(FScale.X, 1.0, TEpsilon.Scale) and SameValue(FScale.Y, 1.0, TEpsilon.Scale) and SameValue(FRotationAngle, 0.0, TEpsilon.Scale) then
begin
if (FParentControl <> nil) and not FParentControl.FSimpleTransform then
FSimpleTransform := False
else
FSimpleTransform := True;
end
else
FSimpleTransform := False;
if not FSimpleTransform then
begin
if not SameValue(FRotationAngle, 0.0, TEpsilon.Scale) then
begin
// scale
ScaleMatrix := TMatrix.Identity;
ScaleMatrix.m11 := FScale.X;
ScaleMatrix.m22 := FScale.Y;
FLocalMatrix := ScaleMatrix;
// rotation
if FRotationAngle <> 0 then
begin
M1 := TMatrix.Identity;
M1.m31 := -FRotationCenter.X * FSize.Width * FScale.X;
M1.m32 := -FRotationCenter.Y * FSize.Height * FScale.Y;
M2 := TMatrix.Identity;
M2.m31 := FRotationCenter.X * FSize.Width * FScale.X;
M2.m32 := FRotationCenter.Y * FSize.Height * FScale.Y;
RotMatrix := M1 * (TMatrix.CreateRotation(DegToRad(FRotationAngle)) * M2);
FLocalMatrix := FLocalMatrix * RotMatrix;
end;
// translate
TranslateMatrix := TMatrix.Identity;
TranslateMatrix.m31 := FPosition.X;
TranslateMatrix.m32 := FPosition.Y;
FLocalMatrix := FLocalMatrix * TranslateMatrix;
end
else
begin
FLocalMatrix := TMatrix.Identity;
FLocalMatrix.m31 := FPosition.X;
FLocalMatrix.m32 := FPosition.Y;
FLocalMatrix.m11 := FScale.X;
FLocalMatrix.m22 := FScale.Y;
end;
end
else
begin
FLocalMatrix := TMatrix.Identity;
FLocalMatrix.m31 := FPosition.X;
FLocalMatrix.m32 := FPosition.Y;
end;
RecalcAbsolute;
RecalcUpdateRect;
if HasDisablePaintEffect then
UpdateEffects;
if Visible and (ParentContent <> nil) then
ParentContent.Changed;
if not FAnchorMove then
begin
UpdateExplicitBounds;
UpdateAnchorRules(True);
end;
if (not FInPaintTo) and not IsUpdating then
Repaint;
end;
FMX.Controls单元 中图形矩阵变换的更多相关文章
- 二维图形的矩阵变换(二)——WPF中的矩阵变换基础
原文:二维图形的矩阵变换(二)--WPF中的矩阵变换基础 在前文二维图形的矩阵变换(一)——基本概念中已经介绍过二维图像矩阵变换的一些基础知识,本文中主要介绍一下如何在WPF中进行矩阵变换. Matr ...
- EHlib在数据单元中显示字段值为图形。
-[定制网格数据单元] 在数据单元中显示字段值为图形. TDBGridEh allows to show bitmaps from TImageList component depending o ...
- 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
“/”应用程序中的服务器错误. 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“c552ea94-6fbb-11d5-a9c1-00104bb6fc1c”. 说明: 执行当前 Web ...
- tableau中图形分析相关设置
1.柱形堆叠图单元格顶部显示总计值(可通过参考线实现) 2.调节图形单元格的宽窄度 (ctrl + 右键/左键) 3.折线图预测区间 趋势区间线 分析中预测并不是针对所有的日期格式均其作用,比如日期格 ...
- openstack-kilo--issue(九) heat stacks topology中图形无法正常显示
======声明======= 欢迎转载:转载请注明出处 http://www.cnblogs.com/horizonli/p/6186581.html ==========环境=========== ...
- C语言 将整数写入内存指定的连续字节单元中
将整数数组写入0x40003000开始的连续10个字节内存单元中,注意unsigned char *指向一个字节,而int *指向1个字(4个字),但是可以把字中存储的整数放入字节单元中,只要不超过表 ...
- iOS开发-在表单元中添加子视图
#import <UIKit/UIKit.h> @interface NameAndColorCellTableViewCell : UITableViewCell @property(c ...
- SQLite 对中文路径的支持(用到了StringToWideChar和Utf8Encode在D7的System单元中自带)
最近用SQLITE作为数据库,发现,如果直接传递带中文路径或文件名的数据库,会导致无法打开数据库的情况.看了一下SQLITE的源码,才发现,原来SQLITE中是用UTF8编码进行文件打开操作的. 所以 ...
- WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示
原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...
随机推荐
- Spring Cache缓存技术的介绍
缓存用于提升系统的性能,特别适用于一些对资源需求比较高的操作.本文介绍如何基于spring boot cache技术,使用caffeine作为具体的缓存实现,对操作的结果进行缓存. demo场景 本d ...
- Android-通知栏上的RemoteView
Android-通知栏上的RemoteView 学习自 <Android开发艺术探索> https://developer.android.google.cn/reference/andr ...
- 怎样c# java md5值保持一致
c#方式 /// <summary> /// 获得字符串md5. /// </summary> /// <param name="myString"& ...
- BZOJ3501 : PA2008 Cliquers Strike Back
\[\begin{eqnarray*}ans&=&m^{\sum_{i=1}^n Stirling2(n,i)\bmod 999999598}\bmod 999999599\\& ...
- UVALive 6908 Electric Bike dp
Electric Bike 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8 ...
- 解决Windows x86网易云音乐不能将音乐下载到SD卡的BUG
由于我个人最常用的电脑是Surface pro4 256G版本,装了不少生产力空间还挺吃紧的,音乐之类的必然都存单独的SD卡里.用UWP版本的网易云音乐倒是没问题,最近问题来了,UWP版本的网易云音乐 ...
- Upsync:微博开源基于Nginx容器动态流量管理方案
Upsync:微博开源基于Nginx容器动态流量管理方案 https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=404151075& ...
- 实现DIV层内的文字垂直居中(转)
有时候,为了网页设计的美观,需要把div+css设计的页面里的某些div层里的文字垂直居中,包括多行文字以及单行文字:方法有不少,但真正能实现而代码又简洁的介绍不多,flymorn就为大家介绍几种适用 ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(三)——基本操作
CefSharp本身提供了WPF和WinForm两个版本的控件,这两个版本的控件使用方法大同小异,由于我WPF的版本用的较多,这里就简单的介绍下WPF版的CEFSharp控件的用法. 加载页面: Ch ...
- HDU 4731 Minimum palindrome (2013成都网络赛,找规律构造)
Minimum palindrome Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...