Вода может быть легко взята с CombinedGeometry
. При этом у вас есть возможность нарисовать область, где два Geometry
перекрываются / пересекаются. Теперь вы можете нарисовать огромный Rectangle
в качестве уровня воды + стакан, и получившаяся область будет вашим желаемым результатом.
XAML:
<UserControl.Resources>
<!-- Form of the Beaker with Rotation -->
<PathGeometry x:Key="BeakerForm" Figures="M0,0 L10,10 V135 A10,10 0 0 0 20,145 H 130 A10,10 0 0 0 140,135 V5 L145,0 Z">
<PathGeometry.Transform>
<!-- Angle of the Beaker Rotation (Note: CenterX must be the highest X-Coordinate of the Figures-Data) -->
<RotateTransform Angle="10" CenterX="145"/>
</PathGeometry.Transform>
</PathGeometry>
</UserControl.Resources>
<!-- Canvas to draw the Beaker -->
<Canvas Background="White" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="100,100">
<!-- Beaker Fill-Water -->
<Path Fill="#4F81BD" RenderTransformOrigin="1,0">
<Path.Data>
<!-- A Rectangle and a Beaker wil be drawn and the blue areais only
visible where theese two figures intersect (overlap) -->
<CombinedGeometry GeometryCombineMode="Intersect">
<CombinedGeometry.Geometry1>
<StaticResource ResourceKey="BeakerForm"/>
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<RectangleGeometry Rect="-65,0 315,150" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
<!-- Beaker line in the foreground -->
<Path RenderTransformOrigin="1,0" Stroke="Black" Fill="Transparent" StrokeThickness="2" Data="{StaticResource BeakerForm}"/>
</Canvas>
С этим вы можете настроить Angle
из BeakerForm
, и уровень воды адаптируется к нему.
Редактировать
Стакан имеет размер х = 150 и у = 150 (округлено). Он достигает максимальной ширины, когда он поворачивается на 45 ° и имеет квадратную ширину (150 ^ 2 + 150 ^ 2) = ~ 215 по ширине. На высоту это не влияет, потому что мы установили уровень воды на 0. Таким образом, нам нужен прямоугольник, который покрывает область (красный) от (150 - 215) = от -65 до 150 (315) и от 0 до 150 (высота), как показано ниже :
Тогда мы можем использовать эти числа и получить Rect="-65,0 315,150"
.
Примечание. Центр вращения находится в верхнем правом углу мензурки / квадрата и вращается по часовой стрелке (непрерывно).