├── images
├── pikachu_shape.gif
├── run_desktop_gradle_tool.png
└── wave_circle_animation.gif
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── common
├── src
│ ├── commonMain
│ │ └── kotlin
│ │ │ └── dev
│ │ │ └── mslalith
│ │ │ └── common
│ │ │ ├── platform.kt
│ │ │ ├── utils
│ │ │ ├── Constants.kt
│ │ │ └── extensions
│ │ │ │ ├── ModifierExtensions.kt
│ │ │ │ ├── ComposeExtensions.kt
│ │ │ │ └── FourierExtensions.kt
│ │ │ ├── shared
│ │ │ ├── FourierItem.kt
│ │ │ ├── ComplexNumber.kt
│ │ │ ├── FourierSettings.kt
│ │ │ └── Epicycles.kt
│ │ │ ├── simplewaves
│ │ │ ├── SimpleWaveSettings.kt
│ │ │ ├── SimpleWaveSettingsPanel.kt
│ │ │ └── SquareWaveCircles.kt
│ │ │ ├── settings
│ │ │ ├── SettingsPanelCheckboxItem.kt
│ │ │ └── SettingsPanelSliderItem.kt
│ │ │ ├── App.kt
│ │ │ ├── shapes
│ │ │ ├── ShapeDrawingSettings.kt
│ │ │ ├── ShapeDrawing.kt
│ │ │ ├── 8thNotePoints.kt
│ │ │ ├── PiShapePoints.kt
│ │ │ ├── PikachuPoints.kt
│ │ │ └── MusicNotePoints.kt
│ │ │ └── modifiers
│ │ │ └── FillMinMaxModifier.kt
│ ├── androidMain
│ │ ├── kotlin
│ │ │ └── dev
│ │ │ │ └── mslalith
│ │ │ │ └── common
│ │ │ │ └── platform.kt
│ │ └── AndroidManifest.xml
│ └── desktopMain
│ │ └── kotlin
│ │ └── dev
│ │ └── mslalith
│ │ └── common
│ │ ├── platform.kt
│ │ └── DesktopApp.kt
└── build.gradle.kts
├── gradle.properties
├── desktop
├── src
│ └── jvmMain
│ │ └── kotlin
│ │ └── Main.kt
└── build.gradle.kts
├── android
├── src
│ └── main
│ │ ├── java
│ │ └── dev
│ │ │ └── mslalith
│ │ │ └── android
│ │ │ └── MainActivity.kt
│ │ └── AndroidManifest.xml
└── build.gradle.kts
├── settings.gradle.kts
├── README.md
├── gradlew.bat
├── .gitignore
├── gradlew
└── LICENSE
/images/pikachu_shape.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mslalith/fourier-drawing/HEAD/images/pikachu_shape.gif
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mslalith/fourier-drawing/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/images/run_desktop_gradle_tool.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mslalith/fourier-drawing/HEAD/images/run_desktop_gradle_tool.png
--------------------------------------------------------------------------------
/images/wave_circle_animation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mslalith/fourier-drawing/HEAD/images/wave_circle_animation.gif
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/platform.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common
2 |
3 | expect fun getPlatformName(): String
--------------------------------------------------------------------------------
/common/src/androidMain/kotlin/dev/mslalith/common/platform.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common
2 |
3 | actual fun getPlatformName(): String {
4 | return "Android"
5 | }
--------------------------------------------------------------------------------
/common/src/desktopMain/kotlin/dev/mslalith/common/platform.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common
2 |
3 | actual fun getPlatformName(): String {
4 | return "Desktop"
5 | }
--------------------------------------------------------------------------------
/common/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/utils/Constants.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.utils
2 |
3 | const val PI = Math.PI.toFloat()
4 | const val TWO_PI = 2 * Math.PI.toFloat()
5 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | kotlin.code.style=official
2 | kotlin.native.enableDependencyPropagation=false
3 | android.useAndroidX=true
4 | kotlin.version=1.7.20
5 | agp.version=7.3.0
6 | compose.version=1.2.2
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shared/FourierItem.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shared
2 |
3 | data class FourierItem(
4 | val complexNumber: ComplexNumber,
5 | val frequency: Int,
6 | )
7 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/common/src/desktopMain/kotlin/dev/mslalith/common/DesktopApp.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common
2 |
3 | import androidx.compose.desktop.ui.tooling.preview.Preview
4 | import androidx.compose.runtime.Composable
5 |
6 | @Preview
7 | @Composable
8 | fun AppPreview() {
9 | App()
10 | }
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/simplewaves/SimpleWaveSettings.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.simplewaves
2 |
3 | import androidx.compose.runtime.getValue
4 | import androidx.compose.runtime.mutableStateOf
5 | import androidx.compose.runtime.setValue
6 | import dev.mslalith.common.shared.FourierSettings
7 |
8 | class SimpleWaveSettings : FourierSettings() {
9 | var waveStartPercent by mutableStateOf(0.54f)
10 | }
11 |
--------------------------------------------------------------------------------
/desktop/src/jvmMain/kotlin/Main.kt:
--------------------------------------------------------------------------------
1 | import androidx.compose.ui.unit.DpSize
2 | import androidx.compose.ui.unit.dp
3 | import androidx.compose.ui.window.Window
4 | import androidx.compose.ui.window.application
5 | import androidx.compose.ui.window.rememberWindowState
6 | import dev.mslalith.common.App
7 |
8 |
9 | fun main() = application {
10 | val windowState = rememberWindowState(size = DpSize(width = 1200.dp, height = 800.dp))
11 | Window(
12 | onCloseRequest = ::exitApplication,
13 | state = windowState
14 | ) {
15 | App()
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/android/src/main/java/dev/mslalith/android/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.android
2 |
3 | import dev.mslalith.common.App
4 | import android.os.Bundle
5 | import androidx.activity.compose.setContent
6 | import androidx.appcompat.app.AppCompatActivity
7 | import androidx.compose.material.MaterialTheme
8 |
9 | class MainActivity : AppCompatActivity() {
10 | override fun onCreate(savedInstanceState: Bundle?) {
11 | super.onCreate(savedInstanceState)
12 | setContent {
13 | MaterialTheme {
14 | App()
15 | }
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/utils/extensions/ModifierExtensions.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.utils.extensions
2 |
3 | import androidx.compose.ui.Modifier
4 | import androidx.compose.ui.unit.Dp
5 | import dev.mslalith.common.modifiers.Direction.Horizontal
6 | import dev.mslalith.common.modifiers.FillMinMaxModifier
7 |
8 | fun Modifier.fillMaxWidth(
9 | fraction: Float,
10 | minAllowedSize: Dp = Dp.Unspecified,
11 | maxAllowedSize: Dp = Dp.Unspecified
12 | ) = then(
13 | FillMinMaxModifier(
14 | direction = Horizontal,
15 | fraction = fraction,
16 | minAllowedSize = minAllowedSize,
17 | maxAllowedSize = maxAllowedSize
18 | )
19 | )
20 |
--------------------------------------------------------------------------------
/android/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google()
4 | gradlePluginPortal()
5 | mavenCentral()
6 | maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
7 | }
8 |
9 | plugins {
10 | kotlin("multiplatform").version(extra["kotlin.version"] as String)
11 | kotlin("android").version(extra["kotlin.version"] as String)
12 | id("com.android.application").version(extra["agp.version"] as String)
13 | id("com.android.library").version(extra["agp.version"] as String)
14 | id("org.jetbrains.compose").version(extra["compose.version"] as String)
15 | }
16 | }
17 |
18 | rootProject.name = "fourier-drawing"
19 |
20 | include(":android", ":desktop", ":common")
21 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/utils/extensions/ComposeExtensions.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.utils.extensions
2 |
3 | import androidx.compose.foundation.layout.ColumnScope
4 | import androidx.compose.foundation.layout.RowScope
5 | import androidx.compose.foundation.layout.Spacer
6 | import androidx.compose.foundation.layout.height
7 | import androidx.compose.foundation.layout.width
8 | import androidx.compose.runtime.Composable
9 | import androidx.compose.ui.Modifier
10 | import androidx.compose.ui.unit.Dp
11 |
12 | @Composable
13 | fun RowScope.HorizontalSpacer(width: Dp) = Spacer(modifier = Modifier.width(width = width))
14 |
15 | @Composable
16 | fun ColumnScope.VerticalSpacer(height: Dp) = Spacer(modifier = Modifier.height(height = height))
17 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/settings/SettingsPanelCheckboxItem.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.settings
2 |
3 | import androidx.compose.foundation.layout.Row
4 | import androidx.compose.material.Checkbox
5 | import androidx.compose.material.Text
6 | import androidx.compose.runtime.Composable
7 | import androidx.compose.ui.Alignment
8 | import androidx.compose.ui.Modifier
9 |
10 | @Composable
11 | fun SettingsPanelCheckboxItem(
12 | modifier: Modifier = Modifier,
13 | header: String,
14 | checked: Boolean,
15 | onCheckChange: (Boolean) -> Unit,
16 | ) {
17 | Row(
18 | modifier = modifier,
19 | verticalAlignment = Alignment.CenterVertically
20 | ) {
21 | Checkbox(
22 | checked = checked,
23 | onCheckedChange = onCheckChange
24 | )
25 | Text(text = header)
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/android/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("org.jetbrains.compose")
3 | id("com.android.application")
4 | kotlin("android")
5 | }
6 |
7 | group "dev.mslalith"
8 | version "1.0-SNAPSHOT"
9 |
10 | repositories {
11 | jcenter()
12 | }
13 |
14 | dependencies {
15 | implementation(project(":common"))
16 | implementation("androidx.activity:activity-compose:1.5.0")
17 | }
18 |
19 | android {
20 | compileSdkVersion(33)
21 | defaultConfig {
22 | applicationId = "dev.mslalith.android"
23 | minSdkVersion(24)
24 | targetSdkVersion(33)
25 | versionCode = 1
26 | versionName = "1.0-SNAPSHOT"
27 | }
28 | compileOptions {
29 | sourceCompatibility = JavaVersion.VERSION_1_8
30 | targetCompatibility = JavaVersion.VERSION_1_8
31 | }
32 | buildTypes {
33 | getByName("release") {
34 | isMinifyEnabled = false
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/desktop/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.jetbrains.compose.compose
2 | import org.jetbrains.compose.desktop.application.dsl.TargetFormat
3 |
4 | plugins {
5 | kotlin("multiplatform")
6 | id("org.jetbrains.compose")
7 | }
8 |
9 | group = "dev.mslalith"
10 | version = "1.0-SNAPSHOT"
11 |
12 |
13 | kotlin {
14 | jvm {
15 | jvmToolchain(11)
16 | withJava()
17 | }
18 | sourceSets {
19 | val jvmMain by getting {
20 | dependencies {
21 | implementation(project(":common"))
22 | implementation(compose.desktop.currentOs)
23 | }
24 | }
25 | val jvmTest by getting
26 | }
27 | }
28 |
29 | compose.desktop {
30 | application {
31 | mainClass = "MainKt"
32 | nativeDistributions {
33 | targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
34 | packageName = "fourier-drawing"
35 | packageVersion = "1.0.0"
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/App.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common
2 |
3 | import androidx.compose.foundation.layout.Box
4 | import androidx.compose.foundation.layout.fillMaxSize
5 | import androidx.compose.runtime.Composable
6 | import androidx.compose.runtime.remember
7 | import androidx.compose.ui.Alignment
8 | import androidx.compose.ui.Modifier
9 | import androidx.compose.ui.layout.onSizeChanged
10 | import dev.mslalith.common.shapes.ShapeDrawing
11 | import dev.mslalith.common.simplewaves.SimpleWaveSettings
12 |
13 | @Composable
14 | fun App() {
15 | val settings = remember { SimpleWaveSettings() }
16 |
17 | Box(
18 | modifier = Modifier.fillMaxSize(),
19 | contentAlignment = Alignment.Center
20 | ) {
21 | // SimpleWaves(
22 | // modifier = Modifier.fillMaxSize(),
23 | // settings = settings,
24 | // )
25 | ShapeDrawing(
26 | settings = settings,
27 | modifier = Modifier
28 | .fillMaxSize()
29 | .onSizeChanged { settings.clearShapePoints() },
30 | )
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/utils/extensions/FourierExtensions.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.utils.extensions
2 |
3 | import androidx.compose.ui.geometry.Offset
4 | import dev.mslalith.common.shared.ComplexNumber
5 | import dev.mslalith.common.shared.FourierItem
6 | import dev.mslalith.common.utils.TWO_PI
7 | import kotlin.math.cos
8 | import kotlin.math.sin
9 |
10 | fun discreteFourierTransformOf(
11 | series: List,
12 | ): List {
13 | // Formula reference: https://wikimedia.org/api/rest_v1/media/math/render/svg/9b1598508ebb847e6c726d5b741ae2363d84f616
14 | val N = series.size
15 | return List(series.size) {
16 | val k = it + 1
17 | var sum = ComplexNumber(real = 0f, imaginary = 0f)
18 | series.indices.forEach { n ->
19 | val theta = TWO_PI * k * n / N
20 | sum += ComplexNumber.from(series[n]) * ComplexNumber(real = cos(-theta), imaginary = sin(-theta))
21 | }
22 | sum /= N
23 |
24 | FourierItem(
25 | complexNumber = sum,
26 | frequency = k,
27 | )
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shared/ComplexNumber.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shared
2 |
3 | import androidx.compose.ui.geometry.Offset
4 | import kotlin.math.atan2
5 | import kotlin.math.sqrt
6 |
7 | data class ComplexNumber(
8 | val real: Float,
9 | val imaginary: Float
10 | ) {
11 |
12 | companion object {
13 | fun from(offset: Offset) = ComplexNumber(real = offset.x, imaginary = offset.y)
14 | }
15 |
16 | val amplitude: Float
17 | get() = sqrt((real * real) + (imaginary * imaginary))
18 |
19 | val phase: Float
20 | get() = atan2(imaginary, real)
21 |
22 | operator fun plus(other: ComplexNumber) = ComplexNumber(
23 | real = real + other.real,
24 | imaginary = imaginary + other.imaginary
25 | )
26 |
27 | operator fun times(other: ComplexNumber) = ComplexNumber(
28 | real = (real * other.real) - (imaginary * other.imaginary),
29 | imaginary = (real * other.imaginary) + (imaginary * other.real)
30 | )
31 |
32 | fun reciprocal(): ComplexNumber {
33 | val scale = real * real + imaginary * imaginary
34 | return ComplexNumber(real = real / scale, imaginary = -imaginary / scale)
35 | }
36 |
37 | operator fun div(other: Int) = ComplexNumber(
38 | real = real / other,
39 | imaginary = imaginary / other
40 | )
41 |
42 | operator fun div(other: ComplexNumber) = times(other.reciprocal())
43 | }
44 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Fourier Drawing
2 |
3 | Draw shapes with Fourier epicycles with Compose Multiplatform.
4 |
5 | #### This is still Work in Progress 🚧
6 |
7 | As of now, I'm focused towards Desktop development. Planning to add support to other platforms (include Web)
8 |
9 | ## Screenshots
10 | Wave Circle Animation (inspired from [Wiki](https://upload.wikimedia.org/wikipedia/commons/b/bd/Fourier_series_square_wave_circles_animation.svg))
11 |
12 | 
13 |
14 | Pikachu Shape
15 |
16 | 
17 |
18 | ## Build
19 |
20 | Run project in Desktop using
21 |
22 | ```
23 | ./gradlew :desktop:run
24 | ```
25 |
26 | If you are not a CLI person, you can run from Gradle Tool window
27 |
28 | 
29 |
30 | ## License
31 |
32 | ```
33 | Copyright 2023 M S Lalith
34 |
35 | Licensed under the Apache License, Version 2.0 (the "License");
36 | you may not use this file except in compliance with the License.
37 | You may obtain a copy of the License at
38 |
39 | https://www.apache.org/licenses/LICENSE-2.0
40 |
41 | Unless required by applicable law or agreed to in writing, software
42 | distributed under the License is distributed on an "AS IS" BASIS,
43 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
44 | See the License for the specific language governing permissions and
45 | limitations under the License.
46 |
47 | ```
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/settings/SettingsPanelSliderItem.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.settings
2 |
3 | import androidx.compose.foundation.background
4 | import androidx.compose.foundation.layout.Column
5 | import androidx.compose.foundation.layout.Row
6 | import androidx.compose.foundation.layout.padding
7 | import androidx.compose.foundation.shape.RoundedCornerShape
8 | import androidx.compose.material.Slider
9 | import androidx.compose.material.Text
10 | import androidx.compose.runtime.Composable
11 | import androidx.compose.ui.Modifier
12 | import androidx.compose.ui.draw.clip
13 | import androidx.compose.ui.graphics.Color
14 | import androidx.compose.ui.unit.dp
15 |
16 | @Composable
17 | fun SettingsPanelSliderItem(
18 | modifier: Modifier = Modifier,
19 | header: String,
20 | value: Float,
21 | displayValue: String,
22 | onValueChange: (Float) -> Unit,
23 | valueRange: ClosedFloatingPointRange
24 | ) {
25 | Column(
26 | modifier = modifier
27 | .clip(shape = RoundedCornerShape(size = 8.dp))
28 | .background(color = Color.Gray.copy(alpha = 0.6f))
29 | .padding(horizontal = 12.dp)
30 | .padding(top = 16.dp),
31 | ) {
32 | Row {
33 | Text(
34 | text = header,
35 | modifier = Modifier.weight(weight = 1f),
36 | maxLines = 1
37 | )
38 | Text(text = displayValue)
39 | }
40 | Slider(
41 | value = value,
42 | onValueChange = onValueChange,
43 | valueRange = valueRange,
44 | )
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/common/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.jetbrains.compose.compose
2 |
3 | plugins {
4 | kotlin("multiplatform")
5 | id("org.jetbrains.compose")
6 | id("com.android.library")
7 | }
8 |
9 | group = "dev.mslalith"
10 | version = "1.0-SNAPSHOT"
11 |
12 | kotlin {
13 | android()
14 | jvm("desktop") {
15 | jvmToolchain(11)
16 | }
17 | sourceSets {
18 | val commonMain by getting {
19 | dependencies {
20 | api(compose.runtime)
21 | api(compose.foundation)
22 | api(compose.material)
23 | }
24 | }
25 | val commonTest by getting {
26 | dependencies {
27 | implementation(kotlin("test"))
28 | }
29 | }
30 | val androidMain by getting {
31 | dependencies {
32 | api("androidx.appcompat:appcompat:1.5.1")
33 | api("androidx.core:core-ktx:1.9.0")
34 | }
35 | }
36 | val androidTest by getting {
37 | dependencies {
38 | implementation("junit:junit:4.13.2")
39 | }
40 | }
41 | val desktopMain by getting {
42 | dependencies {
43 | api(compose.preview)
44 | }
45 | }
46 | val desktopTest by getting
47 | }
48 | }
49 |
50 | android {
51 | compileSdkVersion(33)
52 | sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
53 | defaultConfig {
54 | minSdkVersion(24)
55 | targetSdkVersion(33)
56 | }
57 | compileOptions {
58 | sourceCompatibility = JavaVersion.VERSION_1_8
59 | targetCompatibility = JavaVersion.VERSION_1_8
60 | }
61 | }
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shapes/ShapeDrawingSettings.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shapes
2 |
3 | import androidx.compose.foundation.background
4 | import androidx.compose.foundation.layout.Column
5 | import androidx.compose.foundation.layout.padding
6 | import androidx.compose.runtime.Composable
7 | import androidx.compose.ui.Modifier
8 | import androidx.compose.ui.graphics.Color
9 | import androidx.compose.ui.unit.dp
10 | import dev.mslalith.common.settings.SettingsPanelCheckboxItem
11 | import dev.mslalith.common.settings.SettingsPanelSliderItem
12 | import dev.mslalith.common.shared.FourierSettings
13 | import dev.mslalith.common.utils.extensions.VerticalSpacer
14 |
15 | @Composable
16 | fun ShapeDrawingSettingsPanel(
17 | modifier: Modifier = Modifier,
18 | backgroundColor: Color = Color.Gray.copy(alpha = 0.4f),
19 | settings: FourierSettings,
20 | ) {
21 | fun displayValue(value: Float): String {
22 | return String.format("%.2f", value)
23 | }
24 |
25 | Column(
26 | modifier = modifier
27 | .background(color = backgroundColor)
28 | .padding(horizontal = 12.dp, vertical = 12.dp)
29 | ) {
30 | VerticalSpacer(height = 12.dp)
31 | SettingsPanelSliderItem(
32 | header = "Circle Center Percent",
33 | value = settings.circlesCenterPercent,
34 | displayValue = displayValue(settings.circlesCenterPercent),
35 | onValueChange = { settings.circlesCenterPercent = it },
36 | valueRange = 0f..1f,
37 | )
38 | VerticalSpacer(height = 12.dp)
39 | SettingsPanelCheckboxItem(
40 | header = "Show Epicycle Center",
41 | checked = settings.showEpicycleCenter,
42 | onCheckChange = { settings.showEpicycleCenter = it },
43 | )
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shared/FourierSettings.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shared
2 |
3 | import androidx.compose.runtime.getValue
4 | import androidx.compose.runtime.mutableStateListOf
5 | import androidx.compose.runtime.mutableStateOf
6 | import androidx.compose.runtime.setValue
7 | import androidx.compose.ui.geometry.Offset
8 | import androidx.compose.ui.graphics.Path
9 |
10 | abstract class FourierSettings {
11 | var cycleDuration by mutableStateOf(value = 4_000)
12 | var numberOfCircles by mutableStateOf(value = 3)
13 | var maxShapePoints by mutableStateOf(value = 450)
14 | var circlesCenterPercent by mutableStateOf(0.3f)
15 | var showEpicycleCenter by mutableStateOf(value = false)
16 |
17 | // TODO: Maintaining points and drawing them on every frame can become an overhead with complex drawings
18 | // Eliminate list & directly work with Path
19 | private val _shapePoints= mutableStateListOf()
20 | val shapePoints: List
21 | get() = _shapePoints
22 |
23 | fun shapePathContinuous(startOffset: Float = 0f): Path = Path().apply {
24 | _shapePoints.firstOrNull()?.let { moveTo(startOffset, it.y) }
25 | _shapePoints.drop(n = 1).forEachIndexed { index, wavePoint ->
26 | lineTo(x = startOffset + index, y = wavePoint.y)
27 | }
28 | }
29 |
30 | fun shapePathExact(): Path = Path().apply {
31 | _shapePoints.firstOrNull()?.let { moveTo(it.x, it.y) }
32 | _shapePoints.drop(n = 1).forEach { wavePoint ->
33 | lineTo(x = wavePoint.x, y = wavePoint.y)
34 | }
35 | }
36 |
37 |
38 | fun addShapePoint(point: Offset) {
39 | _shapePoints.add(index = 0, element = point)
40 | if (maxShapePoints > 0) {
41 | while (_shapePoints.size > maxShapePoints) _shapePoints.removeLast()
42 | }
43 | }
44 |
45 | fun clearShapePoints() {
46 | _shapePoints.clear()
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/simplewaves/SimpleWaveSettingsPanel.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.simplewaves
2 |
3 | import androidx.compose.foundation.background
4 | import androidx.compose.foundation.layout.Column
5 | import androidx.compose.foundation.layout.padding
6 | import androidx.compose.runtime.Composable
7 | import androidx.compose.ui.Modifier
8 | import androidx.compose.ui.graphics.Color
9 | import androidx.compose.ui.unit.dp
10 | import dev.mslalith.common.settings.SettingsPanelCheckboxItem
11 | import dev.mslalith.common.settings.SettingsPanelSliderItem
12 | import dev.mslalith.common.utils.extensions.VerticalSpacer
13 |
14 | @Composable
15 | fun SimpleWaveSettingsPanel(
16 | modifier: Modifier = Modifier,
17 | backgroundColor: Color = Color.Gray.copy(alpha = 0.4f),
18 | settings: SimpleWaveSettings,
19 | ) {
20 | fun displayValue(value: Float): String {
21 | return String.format("%.2f", value)
22 | }
23 |
24 | Column(
25 | modifier = modifier
26 | .background(color = backgroundColor)
27 | .padding(horizontal = 12.dp, vertical = 12.dp)
28 | ) {
29 | VerticalSpacer(height = 12.dp)
30 | SettingsPanelSliderItem(
31 | header = "Cycle Duration",
32 | value = settings.cycleDuration.toFloat(),
33 | displayValue = settings.cycleDuration.toString(),
34 | onValueChange = { settings.cycleDuration = it.toInt() },
35 | valueRange = 1_000f..15_000f
36 | )
37 | VerticalSpacer(height = 12.dp)
38 | SettingsPanelSliderItem(
39 | header = "Number of Circles",
40 | value = settings.numberOfCircles.toFloat(),
41 | displayValue = settings.numberOfCircles.toString(),
42 | onValueChange = { settings.numberOfCircles = it.toInt() },
43 | valueRange = 0f..12f,
44 | )
45 | VerticalSpacer(height = 12.dp)
46 | SettingsPanelSliderItem(
47 | header = "Circle Center Percent",
48 | value = settings.circlesCenterPercent,
49 | displayValue = displayValue(settings.circlesCenterPercent),
50 | onValueChange = { settings.circlesCenterPercent = it },
51 | valueRange = 0f..1f,
52 | )
53 | VerticalSpacer(height = 12.dp)
54 | SettingsPanelSliderItem(
55 | header = "Wave Start Percent",
56 | value = settings.waveStartPercent,
57 | displayValue = displayValue(settings.waveStartPercent),
58 | onValueChange = { settings.waveStartPercent = it },
59 | valueRange = 0f..1f,
60 | )
61 | VerticalSpacer(height = 12.dp)
62 | SettingsPanelSliderItem(
63 | header = "Max Wave Points",
64 | value = settings.maxShapePoints.toFloat(),
65 | displayValue = settings.maxShapePoints.toString(),
66 | onValueChange = { settings.maxShapePoints = it.toInt() },
67 | valueRange = 0f..600f,
68 | )
69 | VerticalSpacer(height = 12.dp)
70 | SettingsPanelCheckboxItem(
71 | header = "Show Epicycle Center",
72 | checked = settings.showEpicycleCenter,
73 | onCheckChange = { settings.showEpicycleCenter = it },
74 | )
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shared/Epicycles.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shared
2 |
3 | import androidx.compose.ui.geometry.Offset
4 | import androidx.compose.ui.graphics.Color
5 | import androidx.compose.ui.graphics.drawscope.DrawScope
6 | import androidx.compose.ui.graphics.drawscope.Stroke
7 | import dev.mslalith.common.utils.PI
8 | import kotlin.math.cos
9 | import kotlin.math.sin
10 |
11 | fun DrawScope.epicycles(
12 | numberOfCircles: Int,
13 | radius: Float,
14 | time: Float,
15 | center: Offset,
16 | showEpicycleCenter: Boolean,
17 | onEpicycleEnd: (Offset) -> Unit
18 | ) {
19 | val angleInRadians = Math.toRadians(359.0 * time).toFloat()
20 | var previousCenter = center
21 |
22 | repeat(numberOfCircles) {
23 | // Formula reference: https://upload.wikimedia.org/wikipedia/commons/b/bd/Fourier_series_square_wave_circles_animation.svg
24 | val circleCount = (it * 2) + 1
25 | val theta = circleCount * angleInRadians
26 | val multiplier = radius * (4f / (circleCount * PI))
27 | val x = multiplier * cos(theta)
28 | val y = multiplier * sin(theta)
29 | val dotCenter = previousCenter + Offset(x, y)
30 |
31 | drawCircle(
32 | color = Color.Gray.copy(alpha = 0.3f),
33 | radius = multiplier,
34 | center = previousCenter,
35 | style = Stroke(width = 4f)
36 | )
37 |
38 | drawLine(
39 | color = Color.Black.copy(alpha = 0.6f),
40 | start = previousCenter,
41 | end = dotCenter,
42 | strokeWidth = 3f
43 | )
44 |
45 | if (showEpicycleCenter) {
46 | drawCircle(
47 | color = Color.Red,
48 | radius = 4f,
49 | center = dotCenter
50 | )
51 | }
52 |
53 | previousCenter = dotCenter
54 | }
55 | onEpicycleEnd(previousCenter)
56 | }
57 |
58 | fun DrawScope.epicycles(
59 | series: List,
60 | time: Float,
61 | center: Offset,
62 | showEpicycleCenter: Boolean,
63 | onEpicycleEnd: (Offset) -> Unit
64 | ) {
65 | var offset = center.copy(y = size.height * .5f)
66 |
67 | series.forEach { item ->
68 | val previousOffset = offset
69 | val frequency = item.frequency
70 | val radius = item.complexNumber.amplitude
71 | val phase = item.complexNumber.phase
72 | val theta = (frequency * time) + phase
73 | val x = radius * cos(theta)
74 | val y = radius * sin(theta)
75 | offset += Offset(x, y)
76 |
77 | drawCircle(
78 | color = Color.Gray.copy(alpha = 0.3f),
79 | radius = radius,
80 | center = previousOffset,
81 | style = Stroke(width = 4f)
82 | )
83 |
84 | drawLine(
85 | color = Color.Black.copy(alpha = 0.6f),
86 | start = previousOffset,
87 | end = offset,
88 | strokeWidth = 3f
89 | )
90 |
91 | if (showEpicycleCenter) {
92 | drawCircle(
93 | color = Color.Red,
94 | radius = 4f,
95 | center = offset
96 | )
97 | }
98 | }
99 | onEpicycleEnd(offset)
100 | }
101 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/modifiers/FillMinMaxModifier.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.modifiers
2 |
3 | import androidx.compose.ui.layout.LayoutModifier
4 | import androidx.compose.ui.layout.Measurable
5 | import androidx.compose.ui.layout.MeasureResult
6 | import androidx.compose.ui.layout.MeasureScope
7 | import androidx.compose.ui.unit.Constraints
8 | import androidx.compose.ui.unit.Dp
9 | import kotlin.math.roundToInt
10 |
11 | enum class Direction {
12 | Vertical, Horizontal
13 | }
14 |
15 | class FillMinMaxModifier(
16 | private val direction: Direction,
17 | private val fraction: Float,
18 | private val minAllowedSize: Dp = Dp.Unspecified,
19 | private val maxAllowedSize: Dp = Dp.Unspecified
20 | ) : LayoutModifier {
21 |
22 | private fun getSize(size: Int): Int {
23 | val min = if (minAllowedSize == Dp.Unspecified) 0 else minAllowedSize.value.toInt()
24 | val max = if (maxAllowedSize == Dp.Unspecified) Int.MAX_VALUE else maxAllowedSize.value.toInt()
25 |
26 | return when {
27 | size < min -> min
28 | size > max -> max
29 | else -> size
30 | }
31 | }
32 |
33 | override fun MeasureScope.measure(measurable: Measurable, constraints: Constraints): MeasureResult {
34 | val minWidth: Int
35 | val maxWidth: Int
36 | if (constraints.hasBoundedWidth && direction != Direction.Vertical) {
37 | val width = (constraints.maxWidth * fraction).roundToInt()
38 | .coerceIn(constraints.minWidth, constraints.maxWidth)
39 | minWidth = getSize(width)
40 | maxWidth = getSize(width)
41 | } else {
42 | minWidth = constraints.minWidth
43 | maxWidth = constraints.maxWidth
44 | }
45 | val minHeight: Int
46 | val maxHeight: Int
47 | if (constraints.hasBoundedHeight && direction != Direction.Horizontal) {
48 | val height = (constraints.maxHeight * fraction).roundToInt()
49 | .coerceIn(constraints.minHeight, constraints.maxHeight)
50 | minHeight = getSize(height)
51 | maxHeight = getSize(height)
52 | } else {
53 | minHeight = constraints.minHeight
54 | maxHeight = constraints.maxHeight
55 | }
56 | val placeable = measurable.measure(
57 | Constraints(minWidth, maxWidth, minHeight, maxHeight)
58 | )
59 |
60 | return layout(placeable.width, placeable.height) {
61 | placeable.placeRelative(0, 0)
62 | }
63 | }
64 |
65 | override fun equals(other: Any?): Boolean {
66 | if (this === other) return true
67 | if (javaClass != other?.javaClass) return false
68 |
69 | other as FillMinMaxModifier
70 |
71 | if (direction != other.direction) return false
72 | if (fraction != other.fraction) return false
73 | if (minAllowedSize != other.minAllowedSize) return false
74 | if (maxAllowedSize != other.maxAllowedSize) return false
75 |
76 | return true
77 | }
78 |
79 | override fun hashCode(): Int {
80 | var result = direction.hashCode()
81 | result = 31 * result + fraction.hashCode()
82 | result = 31 * result + minAllowedSize.hashCode()
83 | result = 31 * result + maxAllowedSize.hashCode()
84 | return result
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shapes/ShapeDrawing.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shapes
2 |
3 | import androidx.compose.animation.core.Animatable
4 | import androidx.compose.animation.core.tween
5 | import androidx.compose.foundation.Canvas
6 | import androidx.compose.foundation.layout.Row
7 | import androidx.compose.foundation.layout.fillMaxHeight
8 | import androidx.compose.runtime.Composable
9 | import androidx.compose.runtime.LaunchedEffect
10 | import androidx.compose.runtime.remember
11 | import androidx.compose.runtime.rememberCoroutineScope
12 | import androidx.compose.ui.Modifier
13 | import androidx.compose.ui.geometry.Offset
14 | import androidx.compose.ui.graphics.Color
15 | import androidx.compose.ui.graphics.drawscope.Stroke
16 | import androidx.compose.ui.unit.dp
17 | import dev.mslalith.common.shared.FourierSettings
18 | import dev.mslalith.common.shared.epicycles
19 | import dev.mslalith.common.utils.TWO_PI
20 | import dev.mslalith.common.utils.extensions.discreteFourierTransformOf
21 | import dev.mslalith.common.utils.extensions.fillMaxWidth
22 | import kotlinx.coroutines.launch
23 |
24 | @Composable
25 | fun ShapeDrawing(
26 | modifier: Modifier = Modifier,
27 | settings: FourierSettings
28 | ) {
29 | settings.maxShapePoints = 0
30 | val coroutineScope = rememberCoroutineScope()
31 | val animatable = remember { Animatable(initialValue = 0f) }
32 |
33 | LaunchedEffect(key1 = settings.circlesCenterPercent) {
34 | settings.clearShapePoints()
35 | }
36 |
37 | Row(modifier = modifier) {
38 | ShapeDrawingCanvas(
39 | modifier = Modifier.weight(weight = 1f).fillMaxHeight(),
40 | settings = settings,
41 | time = animatable.value,
42 | updateTime = { targetValue ->
43 | coroutineScope.launch {
44 | animatable.animateTo(
45 | targetValue = targetValue,
46 | animationSpec = tween(durationMillis = 1)
47 | )
48 | }
49 | }
50 | )
51 | ShapeDrawingSettingsPanel(
52 | modifier = Modifier.fillMaxWidth(
53 | fraction = .3f,
54 | minAllowedSize = 360.dp,
55 | maxAllowedSize = 600.dp
56 | ).fillMaxHeight(),
57 | settings = settings,
58 | )
59 | }
60 | }
61 |
62 | //val piDft = discreteFourierTransformOf(series = piShape)
63 | //val piDft = discreteFourierTransformOf(series = eighthNote)
64 | //val piDft = discreteFourierTransformOf(series = musicNote)
65 | val piDft = discreteFourierTransformOf(series = pikachuShort)
66 |
67 | @Composable
68 | private fun ShapeDrawingCanvas(
69 | modifier: Modifier = Modifier,
70 | settings: FourierSettings,
71 | time: Float,
72 | updateTime: (Float) -> Unit
73 | ) {
74 | Canvas(modifier = modifier) {
75 | val xCircleCenterOffset = size.width * settings.circlesCenterPercent
76 | epicycles(
77 | series = piDft,
78 | time = time,
79 | center = Offset(x = xCircleCenterOffset, y = size.height * 0.5f),
80 | showEpicycleCenter = settings.showEpicycleCenter,
81 | onEpicycleEnd = { point ->
82 | settings.addShapePoint(point)
83 | val delta = TWO_PI / piDft.size
84 | val newTime = time + delta
85 | updateTime(if (newTime >= TWO_PI) 0f else newTime)
86 | }
87 | )
88 |
89 |
90 | drawPath(
91 | path = settings.shapePathExact(),
92 | color = Color.Blue,
93 | style = Stroke(width = 4f)
94 | )
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/simplewaves/SquareWaveCircles.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.simplewaves
2 |
3 | import androidx.compose.animation.core.Animatable
4 | import androidx.compose.animation.core.LinearEasing
5 | import androidx.compose.animation.core.tween
6 | import androidx.compose.foundation.Canvas
7 | import androidx.compose.foundation.layout.Row
8 | import androidx.compose.foundation.layout.fillMaxHeight
9 | import androidx.compose.runtime.Composable
10 | import androidx.compose.runtime.LaunchedEffect
11 | import androidx.compose.runtime.remember
12 | import androidx.compose.runtime.snapshotFlow
13 | import androidx.compose.ui.Modifier
14 | import androidx.compose.ui.geometry.Offset
15 | import androidx.compose.ui.geometry.lerp
16 | import androidx.compose.ui.graphics.Color
17 | import androidx.compose.ui.graphics.drawscope.Stroke
18 | import androidx.compose.ui.unit.dp
19 | import dev.mslalith.common.shared.epicycles
20 | import dev.mslalith.common.utils.extensions.fillMaxWidth
21 | import kotlinx.coroutines.flow.drop
22 | import kotlinx.coroutines.flow.map
23 |
24 | @Composable
25 | fun SimpleWaves(
26 | modifier: Modifier = Modifier,
27 | settings: SimpleWaveSettings,
28 | radius: Float = 180f
29 | ) {
30 | val animatable = remember { Animatable(initialValue = 0f) }
31 |
32 | // TODO: to be revisited
33 | LaunchedEffect(key1 = settings.cycleDuration) {
34 | animatable.stop()
35 | snapshotFlow { settings.cycleDuration }.drop(count = 1).map { newDuration ->
36 | val transitionDuration = lerp(
37 | start = Offset(x = 0f, y = 0f),
38 | stop = Offset(x = settings.cycleDuration.toFloat(), y = 0f),
39 | fraction = animatable.value
40 | ).x.toInt()
41 | animatable.animateTo(
42 | targetValue = 1f,
43 | animationSpec = tween(durationMillis = settings.cycleDuration - transitionDuration, easing = LinearEasing)
44 | )
45 | }
46 | while (true) {
47 | animatable.animateTo(
48 | targetValue = 1f,
49 | animationSpec = tween(durationMillis = settings.cycleDuration, easing = LinearEasing)
50 | )
51 | animatable.snapTo(targetValue = 0f)
52 | }
53 | }
54 | val time = animatable.value
55 |
56 | Row(modifier = modifier) {
57 | SimpleWavesCanvas(
58 | modifier = Modifier.weight(weight = 1f).fillMaxHeight(),
59 | settings = settings,
60 | radius = radius,
61 | time = time
62 | )
63 | SimpleWaveSettingsPanel(
64 | modifier = Modifier.fillMaxWidth(
65 | fraction = .3f,
66 | minAllowedSize = 360.dp,
67 | maxAllowedSize = 600.dp
68 | ).fillMaxHeight(),
69 | settings = settings,
70 | )
71 | }
72 | }
73 |
74 | @Composable
75 | private fun SimpleWavesCanvas(
76 | modifier: Modifier = Modifier,
77 | settings: SimpleWaveSettings,
78 | radius: Float,
79 | time: Float
80 | ) {
81 | Canvas(modifier = modifier) {
82 | val xCircleCenterOffset = size.width * settings.circlesCenterPercent
83 | val xWaveStartOffset = size.width * settings.waveStartPercent
84 | epicycles(
85 | numberOfCircles = settings.numberOfCircles,
86 | radius = radius,
87 | time = time,
88 | center = Offset(x = xCircleCenterOffset, y = size.height * 0.5f),
89 | showEpicycleCenter = settings.showEpicycleCenter,
90 | onEpicycleEnd = { wavePoint ->
91 | settings.addShapePoint(wavePoint)
92 | drawLine(
93 | color = Color.Blue,
94 | start = wavePoint,
95 | end = Offset(x = xWaveStartOffset, y = wavePoint.y),
96 | strokeWidth = 2f
97 | )
98 | }
99 | )
100 |
101 |
102 | drawPath(
103 | path = settings.shapePathContinuous(startOffset = xWaveStartOffset),
104 | color = Color.Blue,
105 | style = Stroke(width = 4f)
106 | )
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shapes/8thNotePoints.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shapes
2 |
3 | import androidx.compose.ui.geometry.Offset
4 |
5 | val eighthNote = listOf(
6 | Offset(x = 194.99394227655628f, y = 44.99999939839939f),
7 | Offset(x = 185.19277643581736f, y = 43.354028970206855f),
8 | Offset(x = 176.45420811483822f, y = 38.56534004805051f),
9 | Offset(x = 169.757266333485f, y = 31.195975659275426f),
10 | Offset(x = 165.83918236314528f, y = 22.06087807761901f),
11 | Offset(x = 164.72717225849257f, y = 12.137561132546514f),
12 | Offset(x = 159.79925295635684f, y = 3.643158370938152f),
13 | Offset(x = 150.67592453742026f, y = 0.014959022283554075f),
14 | Offset(x = 141.28008798739313f, y = 2.79369065335393f),
15 | Offset(x = 135.59459279179572f, y = 10.804794720411302f),
16 | Offset(x = 135f, y = 20.760093693831934f),
17 | Offset(x = 135f, y = 30.74867382292161f),
18 | Offset(x = 135f, y = 40.746463717117905f),
19 | Offset(x = 135f, y = 50.75062510057481f),
20 | Offset(x = 135f, y = 60.74743094822318f),
21 | Offset(x = 135f, y = 70.74785579388845f),
22 | Offset(x = 135f, y = 80.75356640108339f),
23 | Offset(x = 135f, y = 90.75251360950638f),
24 | Offset(x = 135f, y = 100.75845826017905f),
25 | Offset(x = 135f, y = 110.7566740818943f),
26 | Offset(x = 135f, y = 120.75566931814524f),
27 | Offset(x = 135f, y = 130.74222749657227f),
28 | Offset(x = 135f, y = 140.74900321573534f),
29 | Offset(x = 135f, y = 150.75231333149117f),
30 | Offset(x = 135f, y = 160.74834343460876f),
31 | Offset(x = 135f, y = 170.75459535740916f),
32 | Offset(x = 135f, y = 180.74903506315906f),
33 | Offset(x = 135f, y = 190.745385237138f),
34 | Offset(x = 131.99852851442992f, y = 195.90569246523083f),
35 | Offset(x = 122.62932281359099f, y = 192.43112946278416f),
36 | Offset(x = 112.83810889595188f, y = 190.46926675255037f),
37 | Offset(x = 102.85235047739157f, y = 190.03475136214536f),
38 | Offset(x = 92.9231484375f, y = 191.119400390625f),
39 | Offset(x = 83.27702224146947f, y = 193.7291767374212f),
40 | Offset(x = 74.17278076341671f, y = 197.82894598466973f),
41 | Offset(x = 65.8582488325308f, y = 203.34728755704418f),
42 | Offset(x = 58.575139084960796f, y = 210.19457452347513f),
43 | Offset(x = 52.61396214749833f, y = 218.20486554902575f),
44 | Offset(x = 48.231980117042085f, y = 227.1793482703938f),
45 | Offset(x = 45.66090018935938f, y = 236.8272094326985f),
46 | Offset(x = 45.0314173490394f, y = 246.7924044685602f),
47 | Offset(x = 46.36085409633728f, y = 256.67705025358043f),
48 | Offset(x = 49.60302463111917f, y = 266.127456355585f),
49 | Offset(x = 54.57579232116724f, y = 274.7796600846301f),
50 | Offset(x = 61.047219029388444f, y = 282.4020510302234f),
51 | Offset(x = 68.72795345635386f, y = 288.7852367800829f),
52 | Offset(x = 77.36535153526924f, y = 293.8114696733285f),
53 | Offset(x = 86.69435316966148f, y = 297.3830029540492f),
54 | Offset(x = 96.45702658951498f, y = 299.44419832520884f),
55 | Offset(x = 106.42575398511387f, y = 299.98469910022476f),
56 | Offset(x = 116.378032159055f, y = 299.0080363000406f),
57 | Offset(x = 126.0492629160417f, y = 296.50720804882826f),
58 | Offset(x = 135.20419823895517f, y = 292.50979659778636f),
59 | Offset(x = 143.59329563540268f, y = 287.0811914433584f),
60 | Offset(x = 150.9502444791098f, y = 280.3297892754914f),
61 | Offset(x = 157.01655149267754f, y = 272.39098915633804f),
62 | Offset(x = 161.5173455866534f, y = 263.4761713410753f),
63 | Offset(x = 164.2193219242394f, y = 253.87546612434835f),
64 | Offset(x = 165f, y = 243.90902154059708f),
65 | Offset(x = 165f, y = 233.92807947028615f),
66 | Offset(x = 165f, y = 223.91750947105817f),
67 | Offset(x = 165f, y = 213.91859757556546f),
68 | Offset(x = 165f, y = 203.92309566612542f),
69 | Offset(x = 165f, y = 193.91208768729f),
70 | Offset(x = 165f, y = 183.92015683079308f),
71 | Offset(x = 165f, y = 173.9175500446728f),
72 | Offset(x = 165f, y = 163.91044274300523f),
73 | Offset(x = 165f, y = 153.90998669301942f),
74 | Offset(x = 165f, y = 143.9164402660332f),
75 | Offset(x = 165f, y = 133.91638526136984f),
76 | Offset(x = 165f, y = 123.91389516794149f),
77 | Offset(x = 165f, y = 113.91811730026951f),
78 | Offset(x = 165f, y = 103.91922894177554f),
79 | Offset(x = 165f, y = 93.92492469129036f),
80 | Offset(x = 165f, y = 83.92162787958048f),
81 | Offset(x = 165f, y = 73.90863343441487f),
82 | Offset(x = 167.64052206420328f, y = 68.3728284646665f),
83 | Offset(x = 176.876646320343f, y = 72.19283036422729f),
84 | Offset(x = 186.6061981032444f, y = 74.41226192054619f),
85 | Offset(x = 196.58931950693764f, y = 75.04158326464332f),
86 | Offset(x = 206.28643558587692f, y = 77.20347708406113f),
87 | Offset(x = 214.75775847923757f, y = 82.44288363182545f),
88 | Offset(x = 221.0646733070165f, y = 90.15768329389394f),
89 | Offset(x = 224.4926953890722f, y = 99.48910307196783f),
90 | Offset(x = 225.65399719046428f, y = 109.39432538794354f),
91 | Offset(x = 231.44596103709563f, y = 117.32333522456511f),
92 | Offset(x = 240.89158835406974f, y = 119.97393802456185f),
93 | Offset(x = 249.96845434475318f, y = 116.20849686908349f),
94 | Offset(x = 254.76570753479004f, y = 107.65517820739746f),
95 | Offset(x = 254.55655346105823f, y = 97.68536656980046f),
96 | Offset(x = 252.51980414619464f, y = 87.9055982243063f),
97 | Offset(x = 248.87504892143235f, y = 78.60175340827927f),
98 | Offset(x = 243.7382815794794f, y = 70.04214208202048f),
99 | Offset(x = 237.25504275300938f, y = 62.442576661197705f),
100 | Offset(x = 229.61816864738563f, y = 56.01916050801374f),
101 | Offset(x = 221.0098285179621f, y = 50.93559645776806f),
102 | Offset(x = 211.68456305782712f, y = 47.35978122209225f),
103 | Offset(x = 201.89172316710557f, y = 45.393343214496014f),
104 | )
105 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | !gradle/wrapper/gradle-wrapper.jar
2 | !**/src/main/**/build/
3 | !**/src/test/**/build/
4 | .idea/**
5 |
6 | ### IntelliJ IDEA ###
7 | !**/src/main/**/out/
8 | !**/src/test/**/out/
9 |
10 | ### Eclipse ###
11 | .apt_generated
12 | .factorypath
13 | .settings
14 | .springBeans
15 | .sts4-cache
16 | !**/src/main/**/bin/
17 | !**/src/test/**/bin/
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /nbbuild/
22 | /dist/
23 | /nbdist/
24 | /.nb-gradle/
25 |
26 | ### VS Code ###
27 | .vscode/
28 |
29 | ### Mac OS ###
30 | .DS_Store
31 |
32 | # Created by https://www.toptal.com/developers/gitignore/api/intellij,androidstudio,gradle,kotlin
33 | # Edit at https://www.toptal.com/developers/gitignore?templates=intellij,androidstudio,gradle,kotlin
34 |
35 | ### Intellij ###
36 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
37 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
38 |
39 | # User-specific stuff
40 | .idea/**/workspace.xml
41 | .idea/**/tasks.xml
42 | .idea/**/usage.statistics.xml
43 | .idea/**/dictionaries
44 | .idea/**/shelf
45 |
46 | # AWS User-specific
47 | .idea/**/aws.xml
48 |
49 | # Generated files
50 | .idea/**/contentModel.xml
51 |
52 | # Sensitive or high-churn files
53 | .idea/**/dataSources/
54 | .idea/**/dataSources.ids
55 | .idea/**/dataSources.local.xml
56 | .idea/**/sqlDataSources.xml
57 | .idea/**/dynamic.xml
58 | .idea/**/uiDesigner.xml
59 | .idea/**/dbnavigator.xml
60 |
61 | # Gradle
62 | .idea/**/gradle.xml
63 | .idea/**/libraries
64 |
65 | # Gradle and Maven with auto-import
66 | # When using Gradle or Maven with auto-import, you should exclude module files,
67 | # since they will be recreated, and may cause churn. Uncomment if using
68 | # auto-import.
69 | # .idea/artifacts
70 | # .idea/compiler.xml
71 | # .idea/jarRepositories.xml
72 | # .idea/modules.xml
73 | # .idea/*.iml
74 | # .idea/modules
75 | # *.iml
76 | # *.ipr
77 |
78 | # CMake
79 | cmake-build-*/
80 |
81 | # Mongo Explorer plugin
82 | .idea/**/mongoSettings.xml
83 |
84 | # File-based project format
85 | *.iws
86 |
87 | # IntelliJ
88 | out/
89 |
90 | # mpeltonen/sbt-idea plugin
91 | .idea_modules/
92 |
93 | # JIRA plugin
94 | atlassian-ide-plugin.xml
95 |
96 | # Cursive Clojure plugin
97 | .idea/replstate.xml
98 |
99 | # SonarLint plugin
100 | .idea/sonarlint/
101 |
102 | # Crashlytics plugin (for Android Studio and IntelliJ)
103 | com_crashlytics_export_strings.xml
104 | crashlytics.properties
105 | crashlytics-build.properties
106 | fabric.properties
107 |
108 | # Editor-based Rest Client
109 | .idea/httpRequests
110 |
111 | # Android studio 3.1+ serialized cache file
112 | .idea/caches/build_file_checksums.ser
113 |
114 | ### Intellij Patch ###
115 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
116 |
117 | # *.iml
118 | # modules.xml
119 | # .idea/misc.xml
120 | # *.ipr
121 |
122 | # Sonarlint plugin
123 | # https://plugins.jetbrains.com/plugin/7973-sonarlint
124 | .idea/**/sonarlint/
125 |
126 | # SonarQube Plugin
127 | # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
128 | .idea/**/sonarIssues.xml
129 |
130 | # Markdown Navigator plugin
131 | # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
132 | .idea/**/markdown-navigator.xml
133 | .idea/**/markdown-navigator-enh.xml
134 | .idea/**/markdown-navigator/
135 |
136 | # Cache file creation bug
137 | # See https://youtrack.jetbrains.com/issue/JBR-2257
138 | .idea/$CACHE_FILE$
139 |
140 | # CodeStream plugin
141 | # https://plugins.jetbrains.com/plugin/12206-codestream
142 | .idea/codestream.xml
143 |
144 | # Azure Toolkit for IntelliJ plugin
145 | # https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
146 | .idea/**/azureSettings.xml
147 |
148 | ### Kotlin ###
149 | # Compiled class file
150 | *.class
151 |
152 | # Log file
153 | *.log
154 |
155 | # BlueJ files
156 | *.ctxt
157 |
158 | # Mobile Tools for Java (J2ME)
159 | .mtj.tmp/
160 |
161 | # Package Files #
162 | *.jar
163 | *.war
164 | *.nar
165 | *.ear
166 | *.zip
167 | *.tar.gz
168 | *.rar
169 |
170 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
171 | hs_err_pid*
172 | replay_pid*
173 |
174 | ### Gradle ###
175 | .gradle
176 | **/build/
177 | !src/**/build/
178 |
179 | # Ignore Gradle GUI config
180 | gradle-app.setting
181 |
182 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
183 | !gradle-wrapper.jar
184 |
185 | # Avoid ignore Gradle wrappper properties
186 | !gradle-wrapper.properties
187 |
188 | # Cache of project
189 | .gradletasknamecache
190 |
191 | # Eclipse Gradle plugin generated files
192 | # Eclipse Core
193 | .project
194 | # JDT-specific (Eclipse Java Development Tools)
195 | .classpath
196 |
197 | ### Gradle Patch ###
198 | # Java heap dump
199 | *.hprof
200 |
201 | ### AndroidStudio ###
202 | # Covers files to be ignored for android development using Android Studio.
203 |
204 | # Built application files
205 | *.apk
206 | *.ap_
207 | *.aab
208 |
209 | # Files for the ART/Dalvik VM
210 | *.dex
211 |
212 | # Java class files
213 |
214 | # Generated files
215 | bin/
216 | gen/
217 |
218 | # Gradle files
219 | .gradle/
220 | build/
221 |
222 | # Signing files
223 | .signing/
224 |
225 | # Local configuration file (sdk path, etc)
226 | local.properties
227 |
228 | # Proguard folder generated by Eclipse
229 | proguard/
230 |
231 | # Log Files
232 |
233 | # Android Studio
234 | /*/build/
235 | /*/local.properties
236 | /*/out
237 | /*/*/build
238 | /*/*/production
239 | captures/
240 | .navigation/
241 | *.ipr
242 | *~
243 | *.swp
244 |
245 | # Keystore files
246 | *.jks
247 | *.keystore
248 |
249 | # Google Services (e.g. APIs or Firebase)
250 | # google-services.json
251 |
252 | # Android Patch
253 | gen-external-apklibs
254 |
255 | # External native build folder generated in Android Studio 2.2 and later
256 | .externalNativeBuild
257 |
258 | # NDK
259 | obj/
260 |
261 | # IntelliJ IDEA
262 | *.iml
263 | /out/
264 |
265 | # User-specific configurations
266 | .idea/caches/
267 | .idea/libraries/
268 | .idea/shelf/
269 | .idea/workspace.xml
270 | .idea/tasks.xml
271 | .idea/.name
272 | .idea/compiler.xml
273 | .idea/copyright/profiles_settings.xml
274 | .idea/encodings.xml
275 | .idea/misc.xml
276 | .idea/modules.xml
277 | .idea/scopes/scope_settings.xml
278 | .idea/dictionaries
279 | .idea/vcs.xml
280 | .idea/jsLibraryMappings.xml
281 | .idea/datasources.xml
282 | .idea/dataSources.ids
283 | .idea/sqlDataSources.xml
284 | .idea/dynamic.xml
285 | .idea/uiDesigner.xml
286 | .idea/assetWizardSettings.xml
287 | .idea/gradle.xml
288 | .idea/jarRepositories.xml
289 | .idea/navEditor.xml
290 |
291 | # Legacy Eclipse project files
292 | .cproject
293 | .settings/
294 |
295 | # Mobile Tools for Java (J2ME)
296 |
297 | # Package Files #
298 |
299 | # virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml)
300 |
301 | ## Plugin-specific files:
302 |
303 | # mpeltonen/sbt-idea plugin
304 |
305 | # JIRA plugin
306 |
307 | # Mongo Explorer plugin
308 | .idea/mongoSettings.xml
309 |
310 | # Crashlytics plugin (for Android Studio and IntelliJ)
311 |
312 | ### AndroidStudio Patch ###
313 |
314 | !/gradle/wrapper/gradle-wrapper.jar
315 |
316 | # End of https://www.toptal.com/developers/gitignore/api/intellij,androidstudio,gradle,kotlin
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #
4 | # Copyright © 2015-2021 the original authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | #
21 | # Gradle start up script for POSIX generated by Gradle.
22 | #
23 | # Important for running:
24 | #
25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
26 | # noncompliant, but you have some other compliant shell such as ksh or
27 | # bash, then to run this script, type that shell name before the whole
28 | # command line, like:
29 | #
30 | # ksh Gradle
31 | #
32 | # Busybox and similar reduced shells will NOT work, because this script
33 | # requires all of these POSIX shell features:
34 | # * functions;
35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»;
37 | # * compound commands having a testable exit status, especially «case»;
38 | # * various built-in commands including «command», «set», and «ulimit».
39 | #
40 | # Important for patching:
41 | #
42 | # (2) This script targets any POSIX shell, so it avoids extensions provided
43 | # by Bash, Ksh, etc; in particular arrays are avoided.
44 | #
45 | # The "traditional" practice of packing multiple parameters into a
46 | # space-separated string is a well documented source of bugs and security
47 | # problems, so this is (mostly) avoided, by progressively accumulating
48 | # options in "$@", and eventually passing that to Java.
49 | #
50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
52 | # see the in-line comments for details.
53 | #
54 | # There are tweaks for specific operating systems such as AIX, CygWin,
55 | # Darwin, MinGW, and NonStop.
56 | #
57 | # (3) This script is generated from the Groovy template
58 | # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
59 | # within the Gradle project.
60 | #
61 | # You can find Gradle at https://github.com/gradle/gradle/.
62 | #
63 | ##############################################################################
64 |
65 | # Attempt to set APP_HOME
66 |
67 | # Resolve links: $0 may be a link
68 | app_path=$0
69 |
70 | # Need this for daisy-chained symlinks.
71 | while
72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
73 | [ -h "$app_path" ]
74 | do
75 | ls=$( ls -ld "$app_path" )
76 | link=${ls#*' -> '}
77 | case $link in #(
78 | /*) app_path=$link ;; #(
79 | *) app_path=$APP_HOME$link ;;
80 | esac
81 | done
82 |
83 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
84 |
85 | APP_NAME="Gradle"
86 | APP_BASE_NAME=${0##*/}
87 |
88 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
90 |
91 | # Use the maximum available, or set MAX_FD != -1 to use that value.
92 | MAX_FD=maximum
93 |
94 | warn () {
95 | echo "$*"
96 | } >&2
97 |
98 | die () {
99 | echo
100 | echo "$*"
101 | echo
102 | exit 1
103 | } >&2
104 |
105 | # OS specific support (must be 'true' or 'false').
106 | cygwin=false
107 | msys=false
108 | darwin=false
109 | nonstop=false
110 | case "$( uname )" in #(
111 | CYGWIN* ) cygwin=true ;; #(
112 | Darwin* ) darwin=true ;; #(
113 | MSYS* | MINGW* ) msys=true ;; #(
114 | NONSTOP* ) nonstop=true ;;
115 | esac
116 |
117 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
118 |
119 |
120 | # Determine the Java command to use to start the JVM.
121 | if [ -n "$JAVA_HOME" ] ; then
122 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
123 | # IBM's JDK on AIX uses strange locations for the executables
124 | JAVACMD=$JAVA_HOME/jre/sh/java
125 | else
126 | JAVACMD=$JAVA_HOME/bin/java
127 | fi
128 | if [ ! -x "$JAVACMD" ] ; then
129 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
130 |
131 | Please set the JAVA_HOME variable in your environment to match the
132 | location of your Java installation."
133 | fi
134 | else
135 | JAVACMD=java
136 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137 |
138 | Please set the JAVA_HOME variable in your environment to match the
139 | location of your Java installation."
140 | fi
141 |
142 | # Increase the maximum file descriptors if we can.
143 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144 | case $MAX_FD in #(
145 | max*)
146 | MAX_FD=$( ulimit -H -n ) ||
147 | warn "Could not query maximum file descriptor limit"
148 | esac
149 | case $MAX_FD in #(
150 | '' | soft) :;; #(
151 | *)
152 | ulimit -n "$MAX_FD" ||
153 | warn "Could not set maximum file descriptor limit to $MAX_FD"
154 | esac
155 | fi
156 |
157 | # Collect all arguments for the java command, stacking in reverse order:
158 | # * args from the command line
159 | # * the main class name
160 | # * -classpath
161 | # * -D...appname settings
162 | # * --module-path (only if needed)
163 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
164 |
165 | # For Cygwin or MSYS, switch paths to Windows format before running java
166 | if "$cygwin" || "$msys" ; then
167 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
168 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
169 |
170 | JAVACMD=$( cygpath --unix "$JAVACMD" )
171 |
172 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
173 | for arg do
174 | if
175 | case $arg in #(
176 | -*) false ;; # don't mess with options #(
177 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
178 | [ -e "$t" ] ;; #(
179 | *) false ;;
180 | esac
181 | then
182 | arg=$( cygpath --path --ignore --mixed "$arg" )
183 | fi
184 | # Roll the args list around exactly as many times as the number of
185 | # args, so each arg winds up back in the position where it started, but
186 | # possibly modified.
187 | #
188 | # NB: a `for` loop captures its iteration list before it begins, so
189 | # changing the positional parameters here affects neither the number of
190 | # iterations, nor the values presented in `arg`.
191 | shift # remove old arg
192 | set -- "$@" "$arg" # push replacement arg
193 | done
194 | fi
195 |
196 | # Collect all arguments for the java command;
197 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
198 | # shell script including quotes and variable substitutions, so put them in
199 | # double quotes to make sure that they get re-expanded; and
200 | # * put everything else in single quotes, so that it's not re-expanded.
201 |
202 | set -- \
203 | "-Dorg.gradle.appname=$APP_BASE_NAME" \
204 | -classpath "$CLASSPATH" \
205 | org.gradle.wrapper.GradleWrapperMain \
206 | "$@"
207 |
208 | # Use "xargs" to parse quoted args.
209 | #
210 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed.
211 | #
212 | # In Bash we could simply go:
213 | #
214 | # readarray ARGS < <( xargs -n1 <<<"$var" ) &&
215 | # set -- "${ARGS[@]}" "$@"
216 | #
217 | # but POSIX shell has neither arrays nor command substitution, so instead we
218 | # post-process each arg (as a line of input to sed) to backslash-escape any
219 | # character that might be a shell metacharacter, then use eval to reverse
220 | # that process (while maintaining the separation between arguments), and wrap
221 | # the whole thing up as a single "set" statement.
222 | #
223 | # This will of course break if any of these variables contains a newline or
224 | # an unmatched quote.
225 | #
226 |
227 | eval "set -- $(
228 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
229 | xargs -n1 |
230 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
231 | tr '\n' ' '
232 | )" '"$@"'
233 |
234 | exec "$JAVACMD" "$@"
235 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright 2023 M S Lalith
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shapes/PiShapePoints.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shapes
2 |
3 | import androidx.compose.ui.geometry.Offset
4 |
5 | val piShape = listOf(
6 | Offset(x = 247.1848549165546f, y = 125.6200000055459f),
7 | Offset(x = 237.1870866484988f, y = 125.65514734808441f),
8 | Offset(x = 227.19831768987228f, y = 125.82924688879164f),
9 | Offset(x = 217.21234788361858f, y = 126.27933175169878f),
10 | Offset(x = 207.25081267007158f, y = 127.19841823830502f),
11 | Offset(x = 197.38936442524195f, y = 128.8370093599558f),
12 | Offset(x = 187.74898352086484f, y = 131.47658003652103f),
13 | Offset(x = 178.5285826293477f, y = 135.33562648146574f),
14 | Offset(x = 169.94017999847327f, y = 140.44920475076475f),
15 | Offset(x = 162.1029792898068f, y = 146.64566696003578f),
16 | Offset(x = 154.98828487074707f, y = 153.6727963813928f),
17 | Offset(x = 148.5118378595874f, y = 161.2733302874291f),
18 | Offset(x = 142.5293013026515f, y = 169.29860095941382f),
19 | Offset(x = 136.9513854013011f, y = 177.6050729047507f),
20 | Offset(x = 131.69519174823913f, y = 186.1038635743052f),
21 | Offset(x = 125.04501000567225f, y = 193.44023948552973f),
22 | Offset(x = 115.66926507356506f, y = 196.55976748505842f),
23 | Offset(x = 105.90926673439681f, y = 194.82449555809154f),
24 | Offset(x = 97.95055778441602f, y = 188.9194329415676f),
25 | Offset(x = 93.82918979640716f, y = 179.93562960607179f),
26 | Offset(x = 94.61962875927846f, y = 170.04941301187f),
27 | Offset(x = 97.46368285250665f, y = 160.46345638102298f),
28 | Offset(x = 100.48387133066042f, y = 150.94176277957735f),
29 | Offset(x = 103.719472124876f, y = 141.47294861399885f),
30 | Offset(x = 107.19720952566853f, y = 132.10296865195426f),
31 | Offset(x = 110.96707662640146f, y = 122.83327625235232f),
32 | Offset(x = 115.06714610053973f, y = 113.7179552331837f),
33 | Offset(x = 119.5552566281967f, y = 104.7849159667073f),
34 | Offset(x = 124.49126726354984f, y = 96.08147269461854f),
35 | Offset(x = 129.92068384223754f, y = 87.69251702012309f),
36 | Offset(x = 135.90170018824242f, y = 79.68467986220155f),
37 | Offset(x = 142.4715599395629f, y = 72.14849904278205f),
38 | Offset(x = 149.6463519715965f, y = 65.1755687768981f),
39 | Offset(x = 157.3910720726885f, y = 58.86467763499266f),
40 | Offset(x = 165.67866414957524f, y = 53.25717855867322f),
41 | Offset(x = 174.40176343898017f, y = 48.39980925717453f),
42 | Offset(x = 183.51411623130974f, y = 44.25968397486922f),
43 | Offset(x = 192.89836970309545f, y = 40.81234461532814f),
44 | Offset(x = 202.49229005866127f, y = 37.991971205984264f),
45 | Offset(x = 212.2226759663913f, y = 35.732922512226395f),
46 | Offset(x = 222.07021064949038f, y = 33.96027832841875f),
47 | Offset(x = 231.96873582503017f, y = 32.61518925509483f),
48 | Offset(x = 241.91739791936055f, y = 31.635862621822415f),
49 | Offset(x = 251.90501858584554f, y = 30.972043561390937f),
50 | Offset(x = 261.8869235426614f, y = 30.58197422221103f),
51 | Offset(x = 271.8980421165553f, y = 30.42676629705932f),
52 | Offset(x = 281.8951193569456f, y = 30.421000000000017f),
53 | Offset(x = 291.89291767608574f, y = 30.421000000000024f),
54 | Offset(x = 301.9015989285596f, y = 30.421000000000024f),
55 | Offset(x = 311.8962957197009f, y = 30.421000000000017f),
56 | Offset(x = 321.8977914022196f, y = 30.42100000000002f),
57 | Offset(x = 331.8857633301692f, y = 30.42100000000002f),
58 | Offset(x = 341.8955979114304f, y = 30.42100000000002f),
59 | Offset(x = 351.88696398119305f, y = 30.42100000000002f),
60 | Offset(x = 361.8917824418088f, y = 30.42100000000002f),
61 | Offset(x = 371.8992075943979f, y = 30.42100000000002f),
62 | Offset(x = 381.89092433148124f, y = 30.42100000000002f),
63 | Offset(x = 391.8897096399226f, y = 30.421000000000024f),
64 | Offset(x = 401.9016537919744f, y = 30.42100000000002f),
65 | Offset(x = 411.8825616831773f, y = 30.421000000000017f),
66 | Offset(x = 421.89198586557154f, y = 30.42100000000002f),
67 | Offset(x = 431.8926655975506f, y = 30.42100000000002f),
68 | Offset(x = 441.89132178239373f, y = 30.42100000000002f),
69 | Offset(x = 451.89464039704114f, y = 30.42100000000002f),
70 | Offset(x = 461.89357113051676f, y = 30.42100000000002f),
71 | Offset(x = 471.89054345633576f, y = 30.42100000000002f),
72 | Offset(x = 481.8970955468759f, y = 30.421000000000024f),
73 | Offset(x = 491.8903565520195f, y = 30.421000000000024f),
74 | Offset(x = 501.892166363906f, y = 30.42100000000002f),
75 | Offset(x = 511.8831493004336f, y = 30.42100000000002f),
76 | Offset(x = 521.8990625357912f, y = 30.42100000000002f),
77 | Offset(x = 531.893829924883f, y = 30.42100000000002f),
78 | Offset(x = 541.8911288381116f, y = 30.42100000000002f),
79 | Offset(x = 551.8901260493708f, y = 30.42100000000002f),
80 | Offset(x = 561.8856847711131f, y = 30.42100000000002f),
81 | Offset(x = 571.8869958841572f, y = 30.42100000000002f),
82 | Offset(x = 581.8876704195848f, y = 30.42100000000002f),
83 | Offset(x = 591.874601067873f, y = 30.763897314579687f),
84 | Offset(x = 600.7715612216144f, y = 35.08835817728492f),
85 | Offset(x = 606.6232791276074f, y = 43.07393542643254f),
86 | Offset(x = 608.193f, y = 52.870030303120636f),
87 | Offset(x = 608.193f, y = 62.87480955267766f),
88 | Offset(x = 608.193f, y = 72.8613621925202f),
89 | Offset(x = 608.193f, y = 82.8777212029223f),
90 | Offset(x = 608.193f, y = 92.87423258280852f),
91 | Offset(x = 608.193f, y = 102.88042588053085f),
92 | Offset(x = 606.8541308428174f, y = 112.70016957235686f),
93 | Offset(x = 601.0824673429776f, y = 120.75269960156247f),
94 | Offset(x = 592.246428515625f, y = 125.20953515625001f),
95 | Offset(x = 582.2728903832519f, y = 125.62800000000003f),
96 | Offset(x = 572.2809370612664f, y = 125.62800000000001f),
97 | Offset(x = 562.2790563187791f, y = 125.62800000000001f),
98 | Offset(x = 552.2853388123293f, y = 125.62800000000001f),
99 | Offset(x = 542.2784096367636f, y = 125.62800000000001f),
100 | Offset(x = 532.2868884128927f, y = 125.62800000000001f),
101 | Offset(x = 522.2747402521968f, y = 125.62800000000001f),
102 | Offset(x = 512.2822907490144f, y = 125.62800000000001f),
103 | Offset(x = 502.28390923073033f, y = 125.62800000000001f),
104 | Offset(x = 492.28693535095454f, y = 125.62800000000001f),
105 | Offset(x = 489.8040598033112f, y = 133.8251207878458f),
106 | Offset(x = 488.9378773554337f, y = 143.78975362576904f),
107 | Offset(x = 488.07830715797496f, y = 153.75500958383918f),
108 | Offset(x = 487.2341794193534f, y = 163.72090965396728f),
109 | Offset(x = 486.4099955486873f, y = 173.68884489924315f),
110 | Offset(x = 485.6099718102001f, y = 183.64506250350823f),
111 | Offset(x = 484.8338176840182f, y = 193.62504794629822f),
112 | Offset(x = 484.0865215492248f, y = 203.5949237136841f),
113 | Offset(x = 483.3691565344294f, y = 213.57059413983166f),
114 | Offset(x = 482.6845574756312f, y = 223.5461972348962f),
115 | Offset(x = 482.03481556876136f, y = 233.52950625981416f),
116 | Offset(x = 481.4245667031206f, y = 243.4921268511296f),
117 | Offset(x = 480.854209390612f, y = 253.48080984514098f),
118 | Offset(x = 480.3286907292867f, y = 263.47753709056576f),
119 | Offset(x = 479.85316157302856f, y = 273.465907081604f),
120 | Offset(x = 479.4322228671582f, y = 283.45342971539867f),
121 | Offset(x = 479.0716122861761f, y = 293.44661258283793f),
122 | Offset(x = 478.7785400944782f, y = 303.44909741532945f),
123 | Offset(x = 478.5624420388886f, y = 313.4373632953829f),
124 | Offset(x = 478.43369410637615f, y = 323.43756824810464f),
125 | Offset(x = 478.40658226278356f, y = 333.4423818279753f),
126 | Offset(x = 478.49918897287614f, y = 343.4307575242317f),
127 | Offset(x = 478.73663844504927f, y = 353.44242946685335f),
128 | Offset(x = 479.1524076127813f, y = 363.43185003017174f),
129 | Offset(x = 479.7963822384883f, y = 373.3999575662708f),
130 | Offset(x = 480.74981593195093f, y = 383.35991328513217f),
131 | Offset(x = 482.1494786260423f, y = 393.26314329700847f),
132 | Offset(x = 484.2755589146573f, y = 403.0313440978865f),
133 | Offset(x = 487.8719319308498f, y = 412.330989709513f),
134 | Offset(x = 494.7420826443033f, y = 419.49224683058645f),
135 | Offset(x = 503.0824364843109f, y = 424.98400850581635f),
136 | Offset(x = 512.3447255159156f, y = 428.7084661382214f),
137 | Offset(x = 522.2150536173847f, y = 430.0352809115379f),
138 | Offset(x = 532.0826855655489f, y = 428.60718022152383f),
139 | Offset(x = 541.2169741175716f, y = 424.619570773692f),
140 | Offset(x = 549.2138663178555f, y = 418.62867065749367f),
141 | Offset(x = 555.9262242661812f, y = 411.2231974343158f),
142 | Offset(x = 561.3667713127136f, y = 402.84951892890933f),
143 | Offset(x = 565.595264663809f, y = 393.8011464210874f),
144 | Offset(x = 568.6519114383543f, y = 384.28911032218116f),
145 | Offset(x = 573.2925964934565f, y = 375.5410741106573f),
146 | Offset(x = 581.6808266828946f, y = 370.3141791060598f),
147 | Offset(x = 591.57745f, y = 369.76328750000005f),
148 | Offset(x = 600.7129676600326f, y = 373.61854116577376f),
149 | Offset(x = 606.8534543782537f, y = 381.3482503934083f),
150 | Offset(x = 608.2164818951277f, y = 391.1492352504166f),
151 | Offset(x = 606.9423922388188f, y = 401.0671321299418f),
152 | Offset(x = 605.2605158295072f, y = 410.93612297196427f),
153 | Offset(x = 603.1526658889678f, y = 420.69282550817206f),
154 | Offset(x = 600.5804453178323f, y = 430.356454537356f),
155 | Offset(x = 597.5181573260929f, y = 439.87540738811543f),
156 | Offset(x = 593.9315449319963f, y = 449.2241639917083f),
157 | Offset(x = 589.8096806251169f, y = 458.3190188412144f),
158 | Offset(x = 585.1092727425935f, y = 467.15296653320576f),
159 | Offset(x = 579.826286713187f, y = 475.6389539735321f),
160 | Offset(x = 573.9502753458894f, y = 483.71634427216236f),
161 | Offset(x = 567.4595863205552f, y = 491.3421316073551f),
162 | Offset(x = 560.4050667425661f, y = 498.40091094691803f),
163 | Offset(x = 552.7627870150958f, y = 504.8712328707062f),
164 | Offset(x = 544.6140687990865f, y = 510.64891620971053f),
165 | Offset(x = 535.9780902992525f, y = 515.6987805535022f),
166 | Offset(x = 526.9398226318056f, y = 519.9572247121508f),
167 | Offset(x = 517.5539314046197f, y = 523.393859479815f),
168 | Offset(x = 507.89152131412845f, y = 525.980771814018f),
169 | Offset(x = 498.0505632901992f, y = 527.6959245315279f),
170 | Offset(x = 488.091772771149f, y = 528.534892572665f),
171 | Offset(x = 478.0999399567544f, y = 528.4950022889703f),
172 | Offset(x = 468.14144567871085f, y = 527.5787906616212f),
173 | Offset(x = 458.3053474140026f, y = 525.7940066793913f),
174 | Offset(x = 448.6613774518653f, y = 523.1496843710842f),
175 | Offset(x = 439.29990380956724f, y = 519.6633460755806f),
176 | Offset(x = 430.27343972128125f, y = 515.3402347930355f),
177 | Offset(x = 421.6906468499548f, y = 510.2133248040022f),
178 | Offset(x = 413.6369063626245f, y = 504.3158589295406f),
179 | Offset(x = 406.1630734681894f, y = 497.6583189528161f),
180 | Offset(x = 399.3847731354755f, y = 490.3167682403523f),
181 | Offset(x = 393.3607450253289f, y = 482.3353212059721f),
182 | Offset(x = 388.1639872303734f, y = 473.7974563396857f),
183 | Offset(x = 383.83844165741243f, y = 464.778711789212f),
184 | Offset(x = 380.42225565561296f, y = 455.39232934018366f),
185 | Offset(x = 377.9159099988952f, y = 445.7184450581799f),
186 | Offset(x = 376.30702137686933f, y = 435.8501746359705f),
187 | Offset(x = 375.5649719173768f, y = 425.8833904602423f),
188 | Offset(x = 375.64222377134973f, y = 415.89025692563695f),
189 | Offset(x = 376.4234453353776f, y = 405.91075954994096f),
190 | Offset(x = 377.31632832620835f, y = 395.9563413507463f),
191 | Offset(x = 378.19571971625084f, y = 386.001948896277f),
192 | Offset(x = 379.0639726338386f, y = 376.0302674048424f),
193 | Offset(x = 379.9189297885194f, y = 366.07591791346675f),
194 | Offset(x = 380.7644244098597f, y = 356.10427373416206f),
195 | Offset(x = 381.5983782292694f, y = 346.1499557743963f),
196 | Offset(x = 382.4245514212358f, y = 336.17833745585676f),
197 | Offset(x = 383.2423458235858f, y = 326.20672777969634f),
198 | Offset(x = 384.0526221466781f, y = 316.23512387809717f),
199 | Offset(x = 384.8562411008713f, y = 306.2635228832414f),
200 | Offset(x = 385.6526828146577f, y = 296.30923373614803f),
201 | Offset(x = 386.44557698563557f, y = 286.33762995872195f),
202 | Offset(x = 387.2343944245014f, y = 276.36602048956456f),
203 | Offset(x = 388.01999584161376f, y = 266.39440246085786f),
204 | Offset(x = 388.80324194733123f, y = 256.4227730047841f),
205 | Offset(x = 389.58363704288354f, y = 246.46844114908077f),
206 | Offset(x = 390.36475501154456f, y = 236.49678026710112f),
207 | Offset(x = 391.1460983055978f, y = 226.5250993592796f),
208 | Offset(x = 391.92852763540174f, y = 216.55339555779835f),
209 | Offset(x = 392.7129037113152f, y = 206.5816659948394f),
210 | Offset(x = 393.50008724369667f, y = 196.6099078025849f),
211 | Offset(x = 394.2909389429048f, y = 186.63811811321705f),
212 | Offset(x = 395.0849342289503f, y = 176.6836062848908f),
213 | Offset(x = 395.8856942901175f, y = 166.71174506496777f),
214 | Offset(x = 396.6927031548985f, y = 156.73984374945655f),
215 | Offset(x = 397.50682153365176f, y = 146.76789947053925f),
216 | Offset(x = 398.3274754961919f, y = 136.8132218845984f),
217 | Offset(x = 399.1583789566346f, y = 126.8411831624474f),
218 | Offset(x = 390.4823728272163f, y = 125.6293f),
219 | Offset(x = 380.47808197307586f, y = 125.6293f),
220 | Offset(x = 370.4756236589232f, y = 125.6293f),
221 | Offset(x = 360.47494637452877f, y = 125.62930000000001f),
222 | Offset(x = 350.475309853728f, y = 125.6293f),
223 | Offset(x = 340.4823372850418f, y = 125.6293f),
224 | Offset(x = 330.4745895685453f, y = 125.6293f),
225 | Offset(x = 320.4812840289443f, y = 125.6293f),
226 | Offset(x = 314.4045179886208f, y = 129.77592490431698f),
227 | Offset(x = 313.85065618029245f, y = 139.76164799278808f),
228 | Offset(x = 313.2815437867527f, y = 149.74875039104543f),
229 | Offset(x = 312.69441658002813f, y = 159.73299115348547f),
230 | Offset(x = 312.0870538396596f, y = 169.71285092641986f),
231 | Offset(x = 311.45712496977126f, y = 179.69462991934458f),
232 | Offset(x = 310.80340215269064f, y = 189.67033278136032f),
233 | Offset(x = 310.1238701062263f, y = 199.64599923513154f),
234 | Offset(x = 309.41749833107366f, y = 209.61369088220985f),
235 | Offset(x = 308.6808342114366f, y = 219.5987550223872f),
236 | Offset(x = 307.9146164167958f, y = 229.56851335474718f),
237 | Offset(x = 307.11644323027053f, y = 239.53282682289412f),
238 | Offset(x = 306.2833288899416f, y = 249.50570483329537f),
239 | Offset(x = 305.41649650362854f, y = 259.4500988740412f),
240 | Offset(x = 304.5098721989749f, y = 269.4118330413523f),
241 | Offset(x = 303.5628676974345f, y = 279.3707921502594f),
242 | Offset(x = 302.57353692821323f, y = 289.32122719425115f),
243 | Offset(x = 301.53824532588806f, y = 299.27177864543205f),
244 | Offset(x = 300.45590783582384f, y = 309.2039426002417f),
245 | Offset(x = 299.31904634027825f, y = 319.15409222544207f),
246 | Offset(x = 298.1290828882345f, y = 329.07596460461326f),
247 | Offset(x = 296.87926202684855f, y = 338.99117250258837f),
248 | Offset(x = 295.561904128188f, y = 348.91969247494626f),
249 | Offset(x = 294.17784650014454f, y = 358.81285956682274f),
250 | Offset(x = 292.7145970247923f, y = 368.713694963202f),
251 | Offset(x = 291.170322831917f, y = 378.58310990998393f),
252 | Offset(x = 289.53044939584936f, y = 388.45683189386216f),
253 | Offset(x = 287.78968139052387f, y = 398.3018123143196f),
254 | Offset(x = 285.93309792006124f, y = 408.13031184077073f),
255 | Offset(x = 283.94881369927754f, y = 417.9227879787083f),
256 | Offset(x = 281.8135214014894f, y = 427.6975482729757f),
257 | Offset(x = 279.5087907244295f, y = 437.42505349921043f),
258 | Offset(x = 277.002961050522f, y = 447.10403136724756f),
259 | Offset(x = 274.2541673000401f, y = 456.7282907682131f),
260 | Offset(x = 271.2144189075741f, y = 466.25652402557506f),
261 | Offset(x = 267.8125495263524f, y = 475.6450341512665f),
262 | Offset(x = 263.9251271707505f, y = 484.86658664085917f),
263 | Offset(x = 259.3911783315036f, y = 493.7766334468793f),
264 | Offset(x = 253.9130741566574f, y = 502.1242615662556f),
265 | Offset(x = 247.23716233112867f, y = 509.5570450026697f),
266 | Offset(x = 239.55055862502752f, y = 515.9471580314033f),
267 | Offset(x = 231.0392926116058f, y = 521.1727584582201f),
268 | Offset(x = 221.88134358965482f, y = 525.1785048381265f),
269 | Offset(x = 212.27561181009182f, y = 527.9303924598837f),
270 | Offset(x = 202.39640813871037f, y = 529.4188354317528f),
271 | Offset(x = 192.40092765139593f, y = 529.633907891292f),
272 | Offset(x = 182.47054819221248f, y = 528.5554650629226f),
273 | Offset(x = 172.76553996129357f, y = 526.1461972952749f),
274 | Offset(x = 163.52950902717294f, y = 522.3711136701978f),
275 | Offset(x = 154.99318038894117f, y = 517.1816947876953f),
276 | Offset(x = 147.4858997251991f, y = 510.58798054433f),
277 | Offset(x = 141.35772293526912f, y = 502.7025354756326f),
278 | Offset(x = 136.89680907928334f, y = 493.77327850606423f),
279 | Offset(x = 134.23320769001546f, y = 484.1465724172199f),
280 | Offset(x = 133.31077434808884f, y = 474.20942689861533f),
281 | Offset(x = 133.9285673479058f, y = 464.2282545036697f),
282 | Offset(x = 135.83271966457545f, y = 454.4269264544906f),
283 | Offset(x = 138.78958938632903f, y = 444.8687539206288f),
284 | Offset(x = 142.58710082282008f, y = 435.62748404063086f),
285 | Offset(x = 147.07143187207754f, y = 426.6900437083476f),
286 | Offset(x = 152.11695453743587f, y = 418.05050441336374f),
287 | Offset(x = 157.62106888822024f, y = 409.7012003553098f),
288 | Offset(x = 163.4625157973135f, y = 401.59835736427556f),
289 | Offset(x = 169.22703983179323f, y = 393.422800625294f),
290 | Offset(x = 174.79240176467877f, y = 385.12360606129295f),
291 | Offset(x = 180.1622956000879f, y = 376.68117187047744f),
292 | Offset(x = 185.31983724930762f, y = 368.1081096852888f),
293 | Offset(x = 190.2512802784633f, y = 359.4164192911503f),
294 | Offset(x = 194.96275407276988f, y = 350.58503720904486f),
295 | Offset(x = 199.43547056892854f, y = 341.64120908697544f),
296 | Offset(x = 203.6631175906062f, y = 332.59545606391424f),
297 | Offset(x = 207.6558918344785f, y = 323.42535096922535f),
298 | Offset(x = 211.41006896907655f, y = 314.14060865145314f),
299 | Offset(x = 214.91287054136427f, y = 304.7834289534194f),
300 | Offset(x = 218.17942226917796f, y = 295.33053746895206f),
301 | Offset(x = 221.20849004419034f, y = 285.8077085491978f),
302 | Offset(x = 224.0118428108819f, y = 276.20790594333744f),
303 | Offset(x = 226.59727251178035f, y = 266.54064079538534f),
304 | Offset(x = 228.9703309064828f, y = 256.83249667412747f),
305 | Offset(x = 231.14648617236395f, y = 247.07710326417748f),
306 | Offset(x = 233.1410557343509f, y = 237.2681587124682f),
307 | Offset(x = 234.96313503317498f, y = 227.4337763854217f),
308 | Offset(x = 236.62641309068883f, y = 217.58600742547088f),
309 | Offset(x = 238.15015127307666f, y = 207.70277315349358f),
310 | Offset(x = 239.54748006930356f, y = 197.7968718660166f),
311 | Offset(x = 240.83176507493758f, y = 187.8820049825287f),
312 | Offset(x = 242.01844192985124f, y = 177.95485335397555f),
313 | Offset(x = 243.1222381422445f, y = 168.0123915915221f),
314 | Offset(x = 244.15533235443934f, y = 158.07029327334484f),
315 | Offset(x = 245.13308598214698f, y = 148.1081103872168f),
316 | Offset(x = 246.06466822411008f, y = 138.16136501770558f),
317 | Offset(x = 246.9656472744619f, y = 128.19137921024048f),
318 | ).reversed()
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shapes/PikachuPoints.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shapes
2 |
3 | import androidx.compose.ui.geometry.Offset
4 |
5 | val pikachu = listOf(
6 | Offset(x = 620.535024609375f, y = 40.266f),
7 | Offset(x = 601.8618353848622f, y = 46.66445264224496f),
8 | Offset(x = 584.936967048281f, y = 57.29418842671944f),
9 | Offset(x = 568.6739198886817f, y = 68.9373366138379f),
10 | Offset(x = 552.7858857944759f, y = 81.10076652720011f),
11 | Offset(x = 537.1708229839815f, y = 93.5873280378691f),
12 | Offset(x = 521.7505744755043f, y = 106.32250697269492f),
13 | Offset(x = 506.4977056861618f, y = 119.25978041167932f),
14 | Offset(x = 491.1239605924248f, y = 130.61453206083175f),
15 | Offset(x = 472.0999150703679f, y = 124.46751513645461f),
16 | Offset(x = 452.38762759682197f, y = 121.19901124698313f),
17 | Offset(x = 432.416914018905f, y = 120.87484264255166f),
18 | Offset(x = 412.6022474129121f, y = 123.50332997557544f),
19 | Offset(x = 393.50979691848744f, y = 129.36554881749151f),
20 | Offset(x = 375.9012750634689f, y = 138.13651198140843f),
21 | Offset(x = 356.902174131489f, y = 131.85635032721817f),
22 | Offset(x = 337.8160586708017f, y = 125.9212905393587f),
23 | Offset(x = 318.5884283777601f, y = 120.38611791389084f),
24 | Offset(x = 299.2278641084161f, y = 115.35402223096317f),
25 | Offset(x = 279.71691698415697f, y = 110.96859639155818f),
26 | Offset(x = 260.0401389247573f, y = 107.46639666060759f),
27 | Offset(x = 240.15461407505887f, y = 105.29587627106153f),
28 | Offset(x = 220.19158332849136f, y = 105.66592838779108f),
29 | Offset(x = 217.84019797750298f, y = 116.43515899457519f),
30 | Offset(x = 232.72658526135137f, y = 129.74756545812124f),
31 | Offset(x = 249.20621141678615f, y = 141.07307597580666f),
32 | Offset(x = 266.5874135013271f, y = 150.97402387179037f),
33 | Offset(x = 284.5312239481449f, y = 159.79326683528026f),
34 | Offset(x = 302.8780401288916f, y = 167.754857787543f),
35 | Offset(x = 321.52158689445525f, y = 174.98783939109273f),
36 | Offset(x = 340.4084529197049f, y = 181.56098813987873f),
37 | Offset(x = 343.3504548324981f, y = 197.8343472326761f),
38 | Offset(x = 340.0091645410042f, y = 217.54398693779814f),
39 | Offset(x = 335.9523999003628f, y = 237.12037339003928f),
40 | Offset(x = 336.18770503039906f, y = 257.01211805728155f),
41 | Offset(x = 340.4348120325493f, y = 276.5222177378869f),
42 | Offset(x = 347.941709957616f, y = 295.0308065241885f),
43 | Offset(x = 346.2811893381904f, y = 314.44093754347705f),
44 | Offset(x = 342.77422796186954f, y = 334.1350591361651f),
45 | Offset(x = 339.2701505266699f, y = 353.81298531606967f),
46 | Offset(x = 335.7630506941079f, y = 373.50788444057457f),
47 | Offset(x = 326.05729074924835f, y = 370.8684336462489f),
48 | Offset(x = 328.0533794984435f, y = 350.97311126276753f),
49 | Offset(x = 330.05051203237105f, y = 331.06738531694054f),
50 | Offset(x = 312.14015613458156f, y = 334.4392700939512f),
51 | Offset(x = 298.6263770974372f, y = 332.4835379078176f),
52 | Offset(x = 300.1207494754635f, y = 312.53189015420514f),
53 | Offset(x = 301.6147223241769f, y = 292.5855765918783f),
54 | Offset(x = 303.1076302617903f, y = 272.6534808587013f),
55 | Offset(x = 304.6019017744378f, y = 252.70317977780408f),
56 | Offset(x = 306.0961705116961f, y = 232.75291575165295f),
57 | Offset(x = 307.5900926864033f, y = 212.8072787475504f),
58 | Offset(x = 305.8192204736605f, y = 196.86547072099012f),
59 | Offset(x = 286.585761806117f, y = 202.33042009622187f),
60 | Offset(x = 267.35289175167696f, y = 207.79520222432097f),
61 | Offset(x = 248.11083559225034f, y = 213.262594470526f),
62 | Offset(x = 228.8679793669343f, y = 218.73021404555723f),
63 | Offset(x = 209.62401120705098f, y = 224.19814956304185f),
64 | Offset(x = 190.39158167496745f, y = 229.66280652216233f),
65 | Offset(x = 171.14758260962216f, y = 235.1307508210517f),
66 | Offset(x = 151.91518236746475f, y = 240.595399457802f),
67 | Offset(x = 132.68129423385207f, y = 246.06047086050506f),
68 | Offset(x = 113.43603518881963f, y = 251.52877316703737f),
69 | Offset(x = 94.20262344698958f, y = 256.99370920890806f),
70 | Offset(x = 81.71781255233999f, y = 264.94285062336456f),
71 | Offset(x = 92.82339250644868f, y = 281.5846773852119f),
72 | Offset(x = 103.92343474983119f, y = 298.2182058300921f),
73 | Offset(x = 115.02768688862061f, y = 314.85804284690977f),
74 | Offset(x = 126.12962342817303f, y = 331.49440991425047f),
75 | Offset(x = 139.1025188570082f, y = 342.8343345106757f),
76 | Offset(x = 158.17960074356168f, y = 336.85903530794326f),
77 | Offset(x = 177.27897625764243f, y = 330.8767533236941f),
78 | Offset(x = 196.35149277027747f, y = 324.9028840815445f),
79 | Offset(x = 215.4458155887315f, y = 318.9221846961609f),
80 | Offset(x = 234.53740286941257f, y = 312.9423421324217f),
81 | Offset(x = 253.60619529945626f, y = 306.969639342661f),
82 | Offset(x = 256.8277930211004f, y = 323.43049537123545f),
83 | Offset(x = 257.55240933350217f, y = 343.41932666630566f),
84 | Offset(x = 258.2767743572127f, y = 363.40122606214595f),
85 | Offset(x = 266.0750276808755f, y = 373.66583602367086f),
86 | Offset(x = 285.30542094409464f, y = 368.1717883654451f),
87 | Offset(x = 297.34693858697597f, y = 371.4120605087079f),
88 | Offset(x = 295.66758472895623f, y = 391.33327777751435f),
89 | Offset(x = 294.22634078240395f, y = 410.96479370378603f),
90 | Offset(x = 313.0407959516942f, y = 404.22629027721564f),
91 | Offset(x = 331.4604099223077f, y = 397.97686785741803f),
92 | Offset(x = 327.98064626425185f, y = 417.66798073739926f),
93 | Offset(x = 325.66567383819574f, y = 437.4197163597869f),
94 | Offset(x = 329.98977099385553f, y = 456.90488807515777f),
95 | Offset(x = 338.6476828681823f, y = 474.8753685419081f),
96 | Offset(x = 352.1017153971457f, y = 489.5487451765721f),
97 | Offset(x = 342.3672416694991f, y = 497.1353296492821f),
98 | Offset(x = 325.1949823991216f, y = 507.0041376056582f),
99 | Offset(x = 337.112825027047f, y = 517.8200011157056f),
100 | Offset(x = 356.9852824226615f, y = 519.1290787907039f),
101 | Offset(x = 376.49424006872636f, y = 514.8271905434128f),
102 | Offset(x = 396.0541210300888f, y = 512.1266132829805f),
103 | Offset(x = 407.96204204376465f, y = 502.34228408372746f),
104 | Offset(x = 419.6567377172438f, y = 496.73774007408514f),
105 | Offset(x = 439.63852512523806f, y = 496.12459101037877f),
106 | Offset(x = 459.51695948104094f, y = 498.0981119973754f),
107 | Offset(x = 479.3190029122919f, y = 500.89193429001057f),
108 | Offset(x = 484.8063947229f, y = 512.7134965726865f),
109 | Offset(x = 504.27352547073235f, y = 514.7717060871282f),
110 | Offset(x = 524.1031754038754f, y = 517.3013449703045f),
111 | Offset(x = 543.940828895361f, y = 519.699208574905f),
112 | Offset(x = 563.4854312723571f, y = 516.4556412025879f),
113 | Offset(x = 567.1355037582615f, y = 501.73833642223815f),
114 | Offset(x = 548.0175607364213f, y = 495.8797888690768f),
115 | Offset(x = 541.4537464820345f, y = 487.8514750955651f),
116 | Offset(x = 552.9559415484666f, y = 471.6081774171842f),
117 | Offset(x = 558.5088034781181f, y = 452.49620099455825f),
118 | Offset(x = 557.5051301136372f, y = 432.6019651117559f),
119 | Offset(x = 553.9807236767915f, y = 412.9305743826829f),
120 | Offset(x = 550.5217998664625f, y = 393.2160155562953f),
121 | Offset(x = 547.1137169489934f, y = 373.5140527554752f),
122 | Offset(x = 543.7395930565627f, y = 353.7998233165381f),
123 | Offset(x = 540.3923432440145f, y = 334.0732905207552f),
124 | Offset(x = 537.0737730934864f, y = 314.36878902053235f),
125 | Offset(x = 538.7958931657741f, y = 295.9898799996896f),
126 | Offset(x = 547.3345642753317f, y = 278.0111760973766f),
127 | Offset(x = 550.0133221167216f, y = 258.25655375336447f),
128 | Offset(x = 548.2907013211023f, y = 238.3479486578066f),
129 | Offset(x = 543.2555489781237f, y = 219.01953890508005f),
130 | Offset(x = 541.1471306197395f, y = 199.1565310306862f),
131 | Offset(x = 537.1562611973973f, y = 179.5731417027096f),
132 | Offset(x = 540.2617358311766f, y = 162.48673380684446f),
133 | Offset(x = 553.8047829425313f, y = 147.78861485544184f),
134 | Offset(x = 566.9360210681114f, y = 132.67958015761286f),
135 | Offset(x = 579.5111211011435f, y = 117.14967400265412f),
136 | Offset(x = 591.4135506642847f, y = 101.08130933127029f),
137 | Offset(x = 602.4010473034361f, y = 84.3685945588682f),
138 | Offset(x = 612.0410322344624f, y = 66.84680465370634f),
139 | Offset(x = 619.2817733274611f, y = 48.22918443764246f),
140 | Offset(x = 299.1999199264189f, y = 393.73549354558253f),
141 | Offset(x = 300.87792791329935f, y = 373.8150938090105f),
142 | Offset(x = 296.4086019577376f, y = 361.33565035398857f),
143 | Offset(x = 277.1496055450514f, y = 366.7599625320902f),
144 | Offset(x = 262.14726084594724f, y = 366.36012744140623f),
145 | Offset(x = 261.47523973187447f, y = 346.37095572528807f),
146 | Offset(x = 260.8036628675866f, y = 326.39499815534725f),
147 | Offset(x = 260.131503439314f, y = 306.4017123031796f),
148 | Offset(x = 245.92659979606321f, y = 305.50797926937906f),
149 | Offset(x = 226.83374806866644f, y = 311.4942888772488f),
150 | Offset(x = 207.7642226782329f, y = 317.47328482254613f),
151 | Offset(x = 188.66491773266748f, y = 323.46161775110556f),
152 | Offset(x = 169.58503693838225f, y = 329.44386049549064f),
153 | Offset(x = 150.51082442130763f, y = 335.424326026979f),
154 | Offset(x = 133.493041152839f, y = 335.5462842351664f),
155 | Offset(x = 122.41482402466767f, y = 318.89855728844134f),
156 | Offset(x = 111.33198211890208f, y = 302.2438804838386f),
157 | Offset(x = 100.25784742465815f, y = 285.60228839117127f),
158 | Offset(x = 89.17165371173309f, y = 268.9425746776758f),
159 | Offset(x = 97.95207543239408f, y = 259.6219266258311f),
160 | Offset(x = 117.19305540826775f, y = 254.1660332335565f),
161 | Offset(x = 136.42615139202434f, y = 248.7123753937615f),
162 | Offset(x = 155.6756380316265f, y = 243.25406988679805f),
163 | Offset(x = 174.9065038183354f, y = 237.80104443253396f),
164 | Offset(x = 194.14866774688375f, y = 232.34481532349318f),
165 | Offset(x = 213.39597897131534f, y = 226.88712666833612f),
166 | Offset(x = 232.62966879208415f, y = 221.4333004425527f),
167 | Offset(x = 251.87182266389846f, y = 215.97707418515822f),
168 | Offset(x = 271.1203372333909f, y = 210.51904431440954f),
169 | Offset(x = 290.3614970947266f, y = 205.0630999145508f),
170 | Offset(x = 304.3764403186416f, y = 206.0125629873204f),
171 | Offset(x = 302.86592638650905f, y = 225.95235820821864f),
172 | Offset(x = 301.3549671875f, y = 245.89803125000003f),
173 | Offset(x = 299.84479718536596f, y = 265.83328636465035f),
174 | Offset(x = 298.33408149677575f, y = 285.77574490586903f),
175 | Offset(x = 296.8238169950397f, y = 305.7122474785351f),
176 | Offset(x = 295.3128422243642f, y = 325.6581260767391f),
177 | Offset(x = 296.58409308086004f, y = 342.26968953969947f),
178 | Offset(x = 315.93781603247874f, y = 337.23485462402095f),
179 | Offset(x = 324.89548697364563f, y = 344.34269532303966f),
180 | Offset(x = 322.89972269775365f, y = 364.25854711972516f),
181 | Offset(x = 321.86750651825963f, y = 383.03113086385275f),
182 | Offset(x = 333.4260714119281f, y = 386.39383542505095f),
183 | Offset(x = 320.0681216290733f, y = 397.7510925095007f),
184 | Offset(x = 301.2470426389614f, y = 404.51151925516876f),
185 | Offset(x = 534.1528529034333f, y = 182.81219368265755f),
186 | Offset(x = 537.8816948117845f, y = 202.4671997520996f),
187 | Offset(x = 540.3839648986344f, y = 222.22758164820257f),
188 | Offset(x = 544.8861820543704f, y = 241.6846298392967f),
189 | Offset(x = 545.9899933521715f, y = 261.6180986206044f),
190 | Offset(x = 542.2430957507268f, y = 281.1989033350284f),
191 | Offset(x = 531.9436751902684f, y = 298.17084805691394f),
192 | Offset(x = 533.511105277156f, y = 317.4501170759502f),
193 | Offset(x = 536.8236973536088f, y = 337.16459494940057f),
194 | Offset(x = 540.1704455518113f, y = 356.8920852455493f),
195 | Offset(x = 543.5429648450314f, y = 376.6060129874716f),
196 | Offset(x = 546.9455468702049f, y = 396.31482103869257f),
197 | Offset(x = 550.3842749748503f, y = 416.00581207229277f),
198 | Offset(x = 553.8839931180911f, y = 435.71585883280085f),
199 | Offset(x = 553.9872197168911f, y = 455.5966659158439f),
200 | Offset(x = 547.0391362534431f, y = 474.2381917587195f),
201 | Offset(x = 533.9518964369537f, y = 489.2107006916758f),
202 | Offset(x = 537.9298908268913f, y = 496.92175729701916f),
203 | Offset(x = 557.2925743473128f, y = 501.9504162241493f),
204 | Offset(x = 561.662689814232f, y = 512.510855771286f),
205 | Offset(x = 542.0493044368548f, y = 515.3361687394997f),
206 | Offset(x = 522.2316464559651f, y = 512.7186476908132f),
207 | Offset(x = 502.3852954281484f, y = 510.4128938384591f),
208 | Offset(x = 488.4114296275567f, y = 505.4319691706254f),
209 | Offset(x = 483.69678458750434f, y = 497.4263627311719f),
210 | Offset(x = 463.8759419520477f, y = 494.8580436909967f),
211 | Offset(x = 444.0230324819182f, y = 492.41691666413493f),
212 | Offset(x = 424.03950863614955f, y = 492.80841438144495f),
213 | Offset(x = 404.1474616835751f, y = 494.8270376206121f),
214 | Offset(x = 404.7632360492345f, y = 504.389650430528f),
215 | Offset(x = 388.10969705750745f, y = 508.7110300996048f),
216 | Offset(x = 368.82888750551024f, y = 512.9783314096851f),
217 | Offset(x = 349.0860027948098f, y = 515.5513834485687f),
218 | Offset(x = 329.409879031959f, y = 512.257397350458f),
219 | Offset(x = 341.2293847646413f, y = 501.22015709232204f),
220 | Offset(x = 360.26728989408315f, y = 495.1167094817488f),
221 | Offset(x = 353.6810001626655f, y = 486.17157288582393f),
222 | Offset(x = 340.5234050611232f, y = 471.25045357899074f),
223 | Offset(x = 332.3734007302269f, y = 453.0480436176582f),
224 | Offset(x = 328.74764842745793f, y = 433.4139311120539f),
225 | Offset(x = 332.100517830467f, y = 413.708220192778f),
226 | Offset(x = 335.5902008912807f, y = 394.0220091283201f),
227 | Offset(x = 339.0801098742763f, y = 374.33452357799064f),
228 | Offset(x = 342.5703973876672f, y = 354.64490263910983f),
229 | Offset(x = 346.06148766331484f, y = 334.9507531092521f),
230 | Offset(x = 349.55518407859785f, y = 315.2419016669198f),
231 | Offset(x = 352.2347350139087f, y = 295.6750252467879f),
232 | Offset(x = 344.3911932257891f, y = 277.3057431834364f),
233 | Offset(x = 339.8931898660453f, y = 257.8537364389836f),
234 | Offset(x = 339.4060110600278f, y = 237.9587674992565f),
235 | Offset(x = 343.4122220176971f, y = 218.35491755237376f),
236 | Offset(x = 347.01721890773274f, y = 198.6915984339292f),
237 | Offset(x = 347.5045126505243f, y = 179.92247872769744f),
238 | Offset(x = 328.5239456715951f, y = 173.62768485150394f),
239 | Offset(x = 309.79270617646273f, y = 166.57742739067425f),
240 | Offset(x = 291.3697703665814f, y = 158.82461667766503f),
241 | Offset(x = 273.30748503601694f, y = 150.25761684843383f),
242 | Offset(x = 255.74184208918615f, y = 140.67912675721013f),
243 | Offset(x = 238.98732942278383f, y = 129.79053611286014f),
244 | Offset(x = 223.60553628954622f, y = 117.03341377113654f),
245 | Offset(x = 227.36118704942552f, y = 108.83314700141281f),
246 | Offset(x = 247.3391213622241f, y = 109.67834993378547f),
247 | Offset(x = 267.1406045365179f, y = 112.43127419436036f),
248 | Offset(x = 286.7545404639847f, y = 116.30326268569712f),
249 | Offset(x = 306.2109616518519f, y = 120.95406514949593f),
250 | Offset(x = 325.50588109214596f, y = 126.18652785616129f),
251 | Offset(x = 344.6732339664911f, y = 131.88375111538812f),
252 | Offset(x = 363.73258026242473f, y = 137.96490486654648f),
253 | Offset(x = 381.87595487445424f, y = 139.30626212035656f),
254 | Offset(x = 399.9450412519629f, y = 130.82145201654336f),
255 | Offset(x = 419.2926057858084f, y = 125.85789103479917f),
256 | Offset(x = 439.1980815423782f, y = 124.2639181228027f),
257 | Offset(x = 459.11293164571595f, y = 125.8605104964992f),
258 | Offset(x = 478.6078886149079f, y = 130.3305056804276f),
259 | Offset(x = 496.55150670655667f, y = 132.50512881375727f),
260 | Offset(x = 511.6485704352517f, y = 119.39741008635201f),
261 | Offset(x = 526.9308107511177f, y = 106.48836972877301f),
262 | Offset(x = 542.381822501231f, y = 93.79927453055117f),
263 | Offset(x = 558.0415191843229f, y = 81.3639904458511f),
264 | Offset(x = 573.9817238248907f, y = 69.2710105445214f),
265 | Offset(x = 590.3266230373993f, y = 57.74697181505346f),
266 | Offset(x = 607.4717659871201f, y = 47.49195507614954f),
267 | Offset(x = 613.1026221213663f, y = 54.46735404953683f),
268 | Offset(x = 604.6867210840163f, y = 72.58443974959434f),
269 | Offset(x = 594.4121835742319f, y = 89.7441484987341f),
270 | Offset(x = 582.9931777261932f, y = 106.16428931798359f),
271 | Offset(x = 570.7654992838983f, y = 121.98132509574368f),
272 | Offset(x = 557.914316358206f, y = 137.30279781907007f),
273 | Offset(x = 544.5651649483985f, y = 152.19908271070102f),
274 | Offset(x = 530.8163214478197f, y = 166.71311886787197f),
275 | Offset(x = 425.03710897216797f, y = 312.09f),
276 | Offset(x = 405.53396786151984f, y = 316.3915344534292f),
277 | Offset(x = 385.77643608886825f, y = 319.3993048618489f),
278 | Offset(x = 366.3748172294951f, y = 317.0167656077408f),
279 | Offset(x = 377.67647199110024f, y = 323.42243763216936f),
280 | Offset(x = 397.5795330630601f, y = 321.66423808758987f),
281 | Offset(x = 417.1821639992548f, y = 317.69506717240176f),
282 | Offset(x = 431.59150929394536f, y = 325.31871586328117f),
283 | Offset(x = 429.9479027998404f, y = 345.09768663208047f),
284 | Offset(x = 417.46146139198754f, y = 348.6414891163031f),
285 | Offset(x = 404.05770556648633f, y = 363.46539309851596f),
286 | Offset(x = 387.64234306198466f, y = 374.744572091207f),
287 | Offset(x = 368.359201031165f, y = 379.4989774610738f),
288 | Offset(x = 352.2225062170582f, y = 379.8834513170681f),
289 | Offset(x = 371.7407646787207f, y = 382.98098595872426f),
290 | Offset(x = 390.77380341643243f, y = 377.2966531217083f),
291 | Offset(x = 407.04033773482206f, y = 365.76449436424946f),
292 | Offset(x = 420.41855977637726f, y = 350.9125980974786f),
293 | Offset(x = 432.56821153783034f, y = 349.9216718260709f),
294 | Offset(x = 435.8113776406923f, y = 330.26163736888094f),
295 | Offset(x = 427.63308879152464f, y = 313.1202541911571f),
296 | Offset(x = 528.4051333041325f, y = 376.9420023711489f),
297 | Offset(x = 508.7963482630881f, y = 379.20743800848896f),
298 | Offset(x = 490.14132294351725f, y = 372.3517068178716f),
299 | Offset(x = 474.59123723405594f, y = 359.84469164850714f),
300 | Offset(x = 461.93200848180715f, y = 344.3909574623193f),
301 | Offset(x = 451.35265001288985f, y = 339.91282127456816f),
302 | Offset(x = 452.5715333789682f, y = 320.3100006540597f),
303 | Offset(x = 470.3911082149312f, y = 318.8298860975576f),
304 | Offset(x = 490.0634903617375f, y = 322.37038352573563f),
305 | Offset(x = 509.9966453839769f, y = 323.00931053686224f),
306 | Offset(x = 511.36123453088425f, y = 319.1499966782787f),
307 | Offset(x = 491.45628187306824f, y = 318.8115154116806f),
308 | Offset(x = 471.7781016055303f, y = 315.3043379874484f),
309 | Offset(x = 452.82268607491557f, y = 314.4877085966047f),
310 | Offset(x = 446.8955162153796f, y = 332.8622019996733f),
311 | Offset(x = 450.7081104235f, y = 352.4431073820231f),
312 | Offset(x = 463.7519279145397f, y = 353.5573674006354f),
313 | Offset(x = 477.50497315388014f, y = 368.0486084787204f),
314 | Offset(x = 494.2074739472122f, y = 378.9184578616259f),
315 | Offset(x = 513.5334308026285f, y = 383.4772423801658f),
316 | Offset(x = 530.7429444499512f, y = 377.690299322388f),
317 | Offset(x = 438.26501278795087f, y = 227.30212810193922f),
318 | Offset(x = 447.27488250248706f, y = 217.30523208707797f),
319 | Offset(x = 432.52987886718745f, y = 222.53191818847657f),
320 | Offset(x = 439.79990303214225f, y = 223.81492306090115f),
321 | Offset(x = 467.04367742005707f, y = 237.82573870536854f),
322 | Offset(x = 452.011528901901f, y = 239.92791266569822f),
323 | Offset(x = 435.1258129084987f, y = 237.23900536523206f),
324 | Offset(x = 417.83011692609955f, y = 235.2102494010229f),
325 | Offset(x = 423.6034909421849f, y = 248.04885570583195f),
326 | Offset(x = 428.80763380020085f, y = 267.3515983762988f),
327 | Offset(x = 438.3006493757789f, y = 284.71153042464607f),
328 | Offset(x = 450.99549748294925f, y = 272.72361583796913f),
329 | Offset(x = 457.0772286641619f, y = 253.69072513094693f),
330 | Offset(x = 440.9773828644291f, y = 282.0515109236433f),
331 | Offset(x = 431.7620734558106f, y = 264.5588963317871f),
332 | Offset(x = 445.00079963302613f, y = 257.263790803009f),
333 | Offset(x = 447.44312546561576f, y = 272.19166959251925f),
334 | Offset(x = 445.176026248169f, y = 253.59060823291017f),
335 | Offset(x = 428.4078823692177f, y = 253.10176869353873f),
336 | Offset(x = 436.73948418497616f, y = 240.6756547231942f),
337 | Offset(x = 453.77911661836555f, y = 244.15242350902696f),
338 | Offset(x = 391.9578962276569f, y = 221.25999846618953f),
339 | Offset(x = 408.87722540117795f, y = 212.1812644709125f),
340 | Offset(x = 410.6933889632337f, y = 193.06563904460148f),
341 | Offset(x = 395.78071854156997f, y = 180.96795440354344f),
342 | Offset(x = 377.4526998271644f, y = 186.68033162214326f),
343 | Offset(x = 372.0648607445028f, y = 205.109901076267f),
344 | Offset(x = 384.43667220506893f, y = 219.80099226185305f),
345 | Offset(x = 404.09369663953345f, y = 189.41041077959224f),
346 | Offset(x = 393.82542288177314f, y = 198.8963636259708f),
347 | Offset(x = 386.41352542088623f, y = 187.46480886054042f),
348 | Offset(x = 394.1885611619502f, y = 203.41375149850995f),
349 | Offset(x = 408.5773348638981f, y = 200.72435891609788f),
350 | Offset(x = 398.397896118164f, y = 216.59480129699708f),
351 | Offset(x = 379.9066906905309f, y = 213.03443445402382f),
352 | Offset(x = 376.3426702246094f, y = 194.53016916503907f),
353 | Offset(x = 466.7600015310218f, y = 200.8778962298021f),
354 | Offset(x = 475.83489950540513f, y = 217.80103039393427f),
355 | Offset(x = 494.95135998034925f, y = 219.61547323900834f),
356 | Offset(x = 507.0480140524104f, y = 204.7013417780541f),
357 | Offset(x = 501.33576838281505f, y = 186.37283859398477f),
358 | Offset(x = 482.90951584416996f, y = 180.9872005756579f),
359 | Offset(x = 468.2156484829396f, y = 193.35850555015207f),
360 | Offset(x = 501.06039741239545f, y = 191.5791492414594f),
361 | Offset(x = 501.26478552678395f, y = 210.41538775500888f),
362 | Offset(x = 483.84727210835223f, y = 217.60051168570521f),
363 | Offset(x = 470.711650530529f, y = 204.0899564709127f),
364 | Offset(x = 481.50705862331085f, y = 203.87076978224553f),
365 | Offset(x = 493.43198073918455f, y = 190.7322319795132f),
366 | Offset(x = 480.24653854556084f, y = 199.31642547775508f),
367 | Offset(x = 479.9098098464727f, y = 186.1168811640322f),
368 | Offset(x = 391.9999981896097f, y = 251.3206675216803f),
369 | Offset(x = 384.14244172692634f, y = 233.55822194964878f),
370 | Offset(x = 365.71290876611397f, y = 227.4136429353595f),
371 | Offset(x = 348.7663005853866f, y = 236.9045682075072f),
372 | Offset(x = 344.37719441061023f, y = 255.82152656513452f),
373 | Offset(x = 355.4215129917972f, y = 271.812317989365f),
374 | Offset(x = 374.68191884269714f, y = 274.39840084838863f),
375 | Offset(x = 389.55377692679986f, y = 261.8912757929414f),
376 | Offset(x = 349.62971696520276f, y = 242.5741744864106f),
377 | Offset(x = 365.11348737713183f, y = 231.2042823781073f),
378 | Offset(x = 383.1513609055996f, y = 237.8024052600004f),
379 | Offset(x = 387.645128365928f, y = 256.46525005874634f),
380 | Offset(x = 374.59615731925965f, y = 270.5505041015625f),
381 | Offset(x = 355.63207153701785f, y = 267.48241095830804f),
382 | Offset(x = 493.25000181039076f, y = 251.33933247831973f),
383 | Offset(x = 501.11084186488273f, y = 269.1017780503512f),
384 | Offset(x = 519.5408344291457f, y = 275.24635706464045f),
385 | Offset(x = 536.4853389223051f, y = 265.7554317924928f),
386 | Offset(x = 540.8765528258144f, y = 246.83847343486548f),
387 | Offset(x = 529.8292451085575f, y = 230.84768201063497f),
388 | Offset(x = 510.57098831367495f, y = 228.2615991516113f),
389 | Offset(x = 495.7050473332312f, y = 240.75227256654762f),
390 | Offset(x = 526.0307484728979f, y = 232.98371696520272f),
391 | Offset(x = 537.3999095110245f, y = 248.4520315540791f),
392 | Offset(x = 530.8122823505098f, y = 266.4949006312311f),
393 | Offset(x = 512.1399245887645f, y = 270.99912836592796f),
394 | Offset(x = 498.05640289843757f, y = 257.95015731925963f),
395 | Offset(x = 501.12449604169205f, y = 238.98607153701784f),
396 | )
397 |
398 | val pikachuShort = listOf(
399 | Offset(x = 620.535024609375f, y = 40.266f),
400 | Offset(x = 601.8618353848622f, y = 46.66445264224496f),
401 | Offset(x = 584.936967048281f, y = 57.29418842671944f),
402 | Offset(x = 568.6739198886817f, y = 68.9373366138379f),
403 | Offset(x = 552.7858857944759f, y = 81.10076652720011f),
404 | Offset(x = 537.1708229839815f, y = 93.5873280378691f),
405 | Offset(x = 521.7505744755043f, y = 106.32250697269492f),
406 | Offset(x = 506.4977056861618f, y = 119.25978041167932f),
407 | Offset(x = 491.1239605924248f, y = 130.61453206083175f),
408 | Offset(x = 472.0999150703679f, y = 124.46751513645461f),
409 | Offset(x = 452.38762759682197f, y = 121.19901124698313f),
410 | Offset(x = 432.416914018905f, y = 120.87484264255166f),
411 | Offset(x = 412.6022474129121f, y = 123.50332997557544f),
412 | Offset(x = 393.50979691848744f, y = 129.36554881749151f),
413 | Offset(x = 375.9012750634689f, y = 138.13651198140843f),
414 | Offset(x = 356.902174131489f, y = 131.85635032721817f),
415 | Offset(x = 337.8160586708017f, y = 125.9212905393587f),
416 | Offset(x = 318.5884283777601f, y = 120.38611791389084f),
417 | Offset(x = 299.2278641084161f, y = 115.35402223096317f),
418 | Offset(x = 279.71691698415697f, y = 110.96859639155818f),
419 | Offset(x = 260.0401389247573f, y = 107.46639666060759f),
420 | Offset(x = 240.15461407505887f, y = 105.29587627106153f),
421 | Offset(x = 220.19158332849136f, y = 105.66592838779108f),
422 | Offset(x = 217.84019797750298f, y = 116.43515899457519f),
423 | Offset(x = 232.72658526135137f, y = 129.74756545812124f),
424 | Offset(x = 249.20621141678615f, y = 141.07307597580666f),
425 | Offset(x = 266.5874135013271f, y = 150.97402387179037f),
426 | Offset(x = 284.5312239481449f, y = 159.79326683528026f),
427 | Offset(x = 302.8780401288916f, y = 167.754857787543f),
428 | Offset(x = 321.52158689445525f, y = 174.98783939109273f),
429 | Offset(x = 340.4084529197049f, y = 181.56098813987873f),
430 | Offset(x = 343.3504548324981f, y = 197.8343472326761f),
431 | Offset(x = 340.0091645410042f, y = 217.54398693779814f),
432 | Offset(x = 335.9523999003628f, y = 237.12037339003928f),
433 | Offset(x = 336.18770503039906f, y = 257.01211805728155f),
434 | Offset(x = 340.4348120325493f, y = 276.5222177378869f),
435 | Offset(x = 347.941709957616f, y = 295.0308065241885f),
436 | Offset(x = 346.2811893381904f, y = 314.44093754347705f),
437 | Offset(x = 342.77422796186954f, y = 334.1350591361651f),
438 | Offset(x = 339.2701505266699f, y = 353.81298531606967f),
439 | Offset(x = 335.7630506941079f, y = 373.50788444057457f),
440 | Offset(x = 326.05729074924835f, y = 370.8684336462489f),
441 | Offset(x = 328.0533794984435f, y = 350.97311126276753f),
442 | Offset(x = 330.05051203237105f, y = 331.06738531694054f),
443 | Offset(x = 312.14015613458156f, y = 334.4392700939512f),
444 | Offset(x = 298.6263770974372f, y = 332.4835379078176f),
445 | Offset(x = 300.1207494754635f, y = 312.53189015420514f),
446 | Offset(x = 301.6147223241769f, y = 292.5855765918783f),
447 | Offset(x = 303.1076302617903f, y = 272.6534808587013f),
448 | Offset(x = 304.6019017744378f, y = 252.70317977780408f),
449 | Offset(x = 306.0961705116961f, y = 232.75291575165295f),
450 | Offset(x = 307.5900926864033f, y = 212.8072787475504f),
451 | Offset(x = 305.8192204736605f, y = 196.86547072099012f),
452 | Offset(x = 286.585761806117f, y = 202.33042009622187f),
453 | Offset(x = 267.35289175167696f, y = 207.79520222432097f),
454 | Offset(x = 248.11083559225034f, y = 213.262594470526f),
455 | Offset(x = 228.8679793669343f, y = 218.73021404555723f),
456 | Offset(x = 209.62401120705098f, y = 224.19814956304185f),
457 | Offset(x = 190.39158167496745f, y = 229.66280652216233f),
458 | Offset(x = 171.14758260962216f, y = 235.1307508210517f),
459 | Offset(x = 151.91518236746475f, y = 240.595399457802f),
460 | Offset(x = 132.68129423385207f, y = 246.06047086050506f),
461 | Offset(x = 113.43603518881963f, y = 251.52877316703737f),
462 | Offset(x = 94.20262344698958f, y = 256.99370920890806f),
463 | Offset(x = 81.71781255233999f, y = 264.94285062336456f),
464 | Offset(x = 92.82339250644868f, y = 281.5846773852119f),
465 | Offset(x = 103.92343474983119f, y = 298.2182058300921f),
466 | Offset(x = 115.02768688862061f, y = 314.85804284690977f),
467 | Offset(x = 126.12962342817303f, y = 331.49440991425047f),
468 | Offset(x = 139.1025188570082f, y = 342.8343345106757f),
469 | Offset(x = 158.17960074356168f, y = 336.85903530794326f),
470 | Offset(x = 177.27897625764243f, y = 330.8767533236941f),
471 | Offset(x = 196.35149277027747f, y = 324.9028840815445f),
472 | Offset(x = 215.4458155887315f, y = 318.9221846961609f),
473 | Offset(x = 234.53740286941257f, y = 312.9423421324217f),
474 | Offset(x = 253.60619529945626f, y = 306.969639342661f),
475 | Offset(x = 256.8277930211004f, y = 323.43049537123545f),
476 | Offset(x = 257.55240933350217f, y = 343.41932666630566f),
477 | Offset(x = 258.2767743572127f, y = 363.40122606214595f),
478 | Offset(x = 266.0750276808755f, y = 373.66583602367086f),
479 | Offset(x = 285.30542094409464f, y = 368.1717883654451f),
480 | Offset(x = 297.34693858697597f, y = 371.4120605087079f),
481 | Offset(x = 295.66758472895623f, y = 391.33327777751435f),
482 | Offset(x = 294.22634078240395f, y = 410.96479370378603f),
483 | Offset(x = 313.0407959516942f, y = 404.22629027721564f),
484 | Offset(x = 331.4604099223077f, y = 397.97686785741803f),
485 | Offset(x = 327.98064626425185f, y = 417.66798073739926f),
486 | Offset(x = 325.66567383819574f, y = 437.4197163597869f),
487 | Offset(x = 329.98977099385553f, y = 456.90488807515777f),
488 | Offset(x = 338.6476828681823f, y = 474.8753685419081f),
489 | Offset(x = 352.1017153971457f, y = 489.5487451765721f),
490 | Offset(x = 342.3672416694991f, y = 497.1353296492821f),
491 | Offset(x = 325.1949823991216f, y = 507.0041376056582f),
492 | Offset(x = 337.112825027047f, y = 517.8200011157056f),
493 | Offset(x = 356.9852824226615f, y = 519.1290787907039f),
494 | Offset(x = 376.49424006872636f, y = 514.8271905434128f),
495 | Offset(x = 396.0541210300888f, y = 512.1266132829805f),
496 | Offset(x = 407.96204204376465f, y = 502.34228408372746f),
497 | Offset(x = 419.6567377172438f, y = 496.73774007408514f),
498 | Offset(x = 439.63852512523806f, y = 496.12459101037877f),
499 | Offset(x = 459.51695948104094f, y = 498.0981119973754f),
500 | Offset(x = 479.3190029122919f, y = 500.89193429001057f),
501 | Offset(x = 484.8063947229f, y = 512.7134965726865f),
502 | Offset(x = 504.27352547073235f, y = 514.7717060871282f),
503 | Offset(x = 524.1031754038754f, y = 517.3013449703045f),
504 | Offset(x = 543.940828895361f, y = 519.699208574905f),
505 | Offset(x = 563.4854312723571f, y = 516.4556412025879f),
506 | Offset(x = 567.1355037582615f, y = 501.73833642223815f),
507 | Offset(x = 548.0175607364213f, y = 495.8797888690768f),
508 | Offset(x = 541.4537464820345f, y = 487.8514750955651f),
509 | Offset(x = 552.9559415484666f, y = 471.6081774171842f),
510 | Offset(x = 558.5088034781181f, y = 452.49620099455825f),
511 | Offset(x = 557.5051301136372f, y = 432.6019651117559f),
512 | Offset(x = 553.9807236767915f, y = 412.9305743826829f),
513 | Offset(x = 550.5217998664625f, y = 393.2160155562953f),
514 | Offset(x = 547.1137169489934f, y = 373.5140527554752f),
515 | Offset(x = 543.7395930565627f, y = 353.7998233165381f),
516 | Offset(x = 540.3923432440145f, y = 334.0732905207552f),
517 | Offset(x = 537.0737730934864f, y = 314.36878902053235f),
518 | Offset(x = 538.7958931657741f, y = 295.9898799996896f),
519 | Offset(x = 547.3345642753317f, y = 278.0111760973766f),
520 | Offset(x = 550.0133221167216f, y = 258.25655375336447f),
521 | Offset(x = 548.2907013211023f, y = 238.3479486578066f),
522 | Offset(x = 543.2555489781237f, y = 219.01953890508005f),
523 | Offset(x = 541.1471306197395f, y = 199.1565310306862f),
524 | Offset(x = 537.1562611973973f, y = 179.5731417027096f),
525 | Offset(x = 540.2617358311766f, y = 162.48673380684446f),
526 | Offset(x = 553.8047829425313f, y = 147.78861485544184f),
527 | Offset(x = 566.9360210681114f, y = 132.67958015761286f),
528 | Offset(x = 579.5111211011435f, y = 117.14967400265412f),
529 | Offset(x = 591.4135506642847f, y = 101.08130933127029f),
530 | Offset(x = 602.4010473034361f, y = 84.3685945588682f),
531 | Offset(x = 612.0410322344624f, y = 66.84680465370634f),
532 | Offset(x = 619.2817733274611f, y = 48.22918443764246f),
533 | )
534 |
--------------------------------------------------------------------------------
/common/src/commonMain/kotlin/dev/mslalith/common/shapes/MusicNotePoints.kt:
--------------------------------------------------------------------------------
1 | package dev.mslalith.common.shapes
2 |
3 | import androidx.compose.ui.geometry.Offset
4 |
5 | val musicNote = listOf(
6 | Offset(x = 503.31496696850405f, y = 5.935554427691372f),
7 | Offset(x = 500.9312441945598f, y = 4.1355895948484545f),
8 | Offset(x = 498.33193151163306f, y = 2.627244744606316f),
9 | Offset(x = 495.58455530350653f, y = 1.4507577539756893f),
10 | Offset(x = 492.7001419771751f, y = 0.6107346251243724f),
11 | Offset(x = 489.7291965522766f, y = 0.12590290451049801f),
12 | Offset(x = 486.7455864021322f, y = 0.004785917454399213f),
13 | Offset(x = 483.76048303241004f, y = 0.2442836182294416f),
14 | Offset(x = 480.7889107801109f, y = 0.7101167621621864f),
15 | Offset(x = 477.83124697871f, y = 1.1771133333934851f),
16 | Offset(x = 474.86589925901114f, y = 1.6453231471498877f),
17 | Offset(x = 471.90219842615807f, y = 2.113272927798456f),
18 | Offset(x = 468.93267559802985f, y = 2.5821419650000896f),
19 | Offset(x = 465.97212914512016f, y = 3.049593688831914f),
20 | Offset(x = 463.0131017286516f, y = 3.5168055663332343f),
21 | Offset(x = 460.04690289259986f, y = 3.9851497660256916f),
22 | Offset(x = 457.07860655005084f, y = 4.45382514884381f),
23 | Offset(x = 454.120688189175f, y = 4.92086191342026f),
24 | Offset(x = 451.1615944277702f, y = 5.388084266371081f),
25 | Offset(x = 448.20113339511835f, y = 5.855522502879729f),
26 | Offset(x = 445.23509591686195f, y = 6.32384122518792f),
27 | Offset(x = 442.27591591608723f, y = 6.791077194794574f),
28 | Offset(x = 439.3144464386336f, y = 7.258674658415024f),
29 | Offset(x = 436.3386505172401f, y = 7.7285341777142165f),
30 | Offset(x = 433.3773465134057f, y = 8.196105514087598f),
31 | Offset(x = 430.4164708707806f, y = 8.663609214911641f),
32 | Offset(x = 427.4509781150035f, y = 9.131841928955485f),
33 | Offset(x = 424.4976432424446f, y = 9.598154989462763f),
34 | Offset(x = 421.52693624900326f, y = 10.06721099894326f),
35 | Offset(x = 418.55431347149795f, y = 10.536569498716467f),
36 | Offset(x = 415.6078616154317f, y = 11.001795774072482f),
37 | Offset(x = 412.6434146781026f, y = 11.469863359940122f),
38 | Offset(x = 409.66353569792267f, y = 11.940367568623058f),
39 | Offset(x = 406.70833906769724f, y = 12.406974588993625f),
40 | Offset(x = 403.7434538620595f, y = 12.87511137467951f),
41 | Offset(x = 400.78395604937805f, y = 13.342397524793707f),
42 | Offset(x = 397.8194544802722f, y = 13.810473736676387f),
43 | Offset(x = 394.8520270550647f, y = 14.279011922893943f),
44 | Offset(x = 391.88367772452824f, y = 14.747695672183049f),
45 | Offset(x = 388.9296391010803f, y = 15.214119850543566f),
46 | Offset(x = 385.96527261821365f, y = 15.682174733155996f),
47 | Offset(x = 383.00556082785056f, y = 16.149494669004607f),
48 | Offset(x = 380.03863376182113f, y = 16.617953851644927f),
49 | Offset(x = 377.0795692272153f, y = 17.085171589867418f),
50 | Offset(x = 374.11621635087647f, y = 17.553066430363888f),
51 | Offset(x = 371.1498946157135f, y = 18.021430035055506f),
52 | Offset(x = 368.18189260181356f, y = 18.4900589452252f),
53 | Offset(x = 365.22743629706105f, y = 18.956549072845064f),
54 | Offset(x = 362.25987696912745f, y = 19.425108085676094f),
55 | Offset(x = 359.2943160730032f, y = 19.893351558653553f),
56 | Offset(x = 356.3319220807994f, y = 20.361094997356812f),
57 | Offset(x = 353.37383427123825f, y = 20.828158516818306f),
58 | Offset(x = 350.4069480379087f, y = 21.296611252231315f),
59 | Offset(x = 347.44649058922886f, y = 21.764048922853256f),
60 | Offset(x = 344.4792495913544f, y = 22.2325576733637f),
61 | Offset(x = 341.5204941256688f, y = 22.699726611541404f),
62 | Offset(x = 338.5569233674699f, y = 23.167655854217593f),
63 | Offset(x = 335.5894866172816f, y = 23.63619551279112f),
64 | Offset(x = 332.6334882026718f, y = 24.102929129889215f),
65 | Offset(x = 329.6611745924622f, y = 24.57223881408476f),
66 | Offset(x = 326.70220318995075f, y = 25.039441847333446f),
67 | Offset(x = 323.72879159999894f, y = 25.508924895646523f),
68 | Offset(x = 320.77060783440476f, y = 25.97600356596404f),
69 | Offset(x = 317.81422261796223f, y = 26.442798256646494f),
70 | Offset(x = 314.84624164113217f, y = 26.91142384519474f),
71 | Offset(x = 311.8819707325339f, y = 27.379463637229403f),
72 | Offset(x = 308.9223591926914f, y = 27.846767744149346f),
73 | Offset(x = 305.9541009295768f, y = 28.315437114463496f),
74 | Offset(x = 302.99246878175046f, y = 28.783060262715907f),
75 | Offset(x = 300.02424363061607f, y = 29.251724404855977f),
76 | Offset(x = 297.0646579519174f, y = 29.719024428463428f),
77 | Offset(x = 294.100598829787f, y = 30.18703078074261f),
78 | Offset(x = 291.133203250432f, y = 30.655563938699682f),
79 | Offset(x = 288.17761519670535f, y = 31.122232762387085f),
80 | Offset(x = 285.2070109905345f, y = 31.591272542401985f),
81 | Offset(x = 282.2504980272f, y = 32.058087403517746f),
82 | Offset(x = 279.2815668707633f, y = 32.52686301946878f),
83 | Offset(x = 276.3154180703279f, y = 32.99519931885111f),
84 | Offset(x = 273.36697602243055f, y = 33.4607398330198f),
85 | Offset(x = 270.39676699797263f, y = 33.9297172163198f),
86 | Offset(x = 267.4335722033378f, y = 34.3975870967063f),
87 | Offset(x = 264.47882027446536f, y = 34.86412390152129f),
88 | Offset(x = 261.50755183479896f, y = 35.33326855984073f),
89 | Offset(x = 258.5350428343829f, y = 35.802609094924875f),
90 | Offset(x = 255.58916663485135f, y = 36.26774447772313f),
91 | Offset(x = 252.6197709768652f, y = 36.73659343555663f),
92 | Offset(x = 249.65511855828674f, y = 37.20469346562528f),
93 | Offset(x = 246.69735704466734f, y = 37.671705465003285f),
94 | Offset(x = 243.72387405466984f, y = 38.14119978693593f),
95 | Offset(x = 240.76243871092797f, y = 38.608791861057284f),
96 | Offset(x = 237.79129182520603f, y = 39.07791732677097f),
97 | Offset(x = 234.8378270828424f, y = 39.544250892906206f),
98 | Offset(x = 231.8812177296595f, y = 40.01108097337473f),
99 | Offset(x = 228.90227019732095f, y = 40.48143811228319f),
100 | Offset(x = 225.95163188555495f, y = 40.94732540274731f),
101 | Offset(x = 222.98788989431938f, y = 41.41528168204644f),
102 | Offset(x = 220.01690980963497f, y = 41.88438081092205f),
103 | Offset(x = 217.06621639817087f, y = 42.35027680128305f),
104 | Offset(x = 214.0993199540709f, y = 42.81873114891269f),
105 | Offset(x = 211.12476246459192f, y = 43.288395127576905f),
106 | Offset(x = 208.17134845223475f, y = 43.75472068376217f),
107 | Offset(x = 205.20890140051407f, y = 44.22247250023049f),
108 | Offset(x = 202.24968416767194f, y = 44.689714348547156f),
109 | Offset(x = 199.2714877087086f, y = 45.15995289767852f),
110 | Offset(x = 196.3099230632782f, y = 45.627565387725824f),
111 | Offset(x = 193.3506334225009f, y = 46.09481866880151f),
112 | Offset(x = 190.38771243283526f, y = 46.562645317099985f),
113 | Offset(x = 187.4252729354967f, y = 47.030395940778725f),
114 | Offset(x = 184.45310965088115f, y = 47.499681889505425f),
115 | Offset(x = 181.49716544935916f, y = 47.96640694669684f),
116 | Offset(x = 178.52446829448223f, y = 48.43577719019074f),
117 | Offset(x = 175.57814089763963f, y = 48.900983814215635f),
118 | Offset(x = 172.61033441249236f, y = 49.369581851621156f),
119 | Offset(x = 169.64419610753657f, y = 49.837916493833056f),
120 | Offset(x = 166.70966955530574f, y = 50.473074408561104f),
121 | Offset(x = 163.8785174421538f, y = 51.45601604939717f),
122 | Offset(x = 161.19380449611717f, y = 52.77159175455443f),
123 | Offset(x = 158.683406373458f, y = 54.40549255975801f),
124 | Offset(x = 156.37675716115467f, y = 56.341795269139226f),
125 | Offset(x = 154.3369701860787f, y = 58.52409003672597f),
126 | Offset(x = 152.5638470321838f, y = 60.950312642396426f),
127 | Offset(x = 151.0997505874485f, y = 63.56696790441125f),
128 | Offset(x = 149.96191106126201f, y = 66.34458492220857f),
129 | Offset(x = 149.17036588011683f, y = 69.23768647684902f),
130 | Offset(x = 148.73620164310933f, y = 72.1992204592824f),
131 | Offset(x = 148.64600000000002f, y = 75.19377116090595f),
132 | Offset(x = 148.64600000000002f, y = 78.19149918975592f),
133 | Offset(x = 148.64600000000002f, y = 81.19202187622842f),
134 | Offset(x = 148.64600000000002f, y = 84.1860912771225f),
135 | Offset(x = 148.64600000000002f, y = 87.20097858977886f),
136 | Offset(x = 148.64600000000004f, y = 90.18868414399051f),
137 | Offset(x = 148.64600000000002f, y = 93.19464245189727f),
138 | Offset(x = 148.64600000000002f, y = 96.19193537065573f),
139 | Offset(x = 148.64600000000002f, y = 99.20044629366882f),
140 | Offset(x = 148.64600000000002f, y = 102.18975454063714f),
141 | Offset(x = 148.646f, y = 105.20147477731085f),
142 | Offset(x = 148.64600000000002f, y = 108.20033258293167f),
143 | Offset(x = 148.64600000000002f, y = 111.18684987943041f),
144 | Offset(x = 148.64600000000002f, y = 114.20018698710763f),
145 | Offset(x = 148.64600000000002f, y = 117.19303361839978f),
146 | Offset(x = 148.64600000000002f, y = 120.19003970813866f),
147 | Offset(x = 148.64600000000002f, y = 123.19914576349552f),
148 | Offset(x = 148.64600000000002f, y = 126.19232988739013f),
149 | Offset(x = 148.64600000000002f, y = 129.19602815794704f),
150 | Offset(x = 148.64600000000002f, y = 132.2001181916196f),
151 | Offset(x = 148.64600000000002f, y = 135.19411589949902f),
152 | Offset(x = 148.64600000000002f, y = 138.20207956302164f),
153 | Offset(x = 148.64600000000002f, y = 141.19368956984505f),
154 | Offset(x = 148.64600000000002f, y = 144.18918814905243f),
155 | Offset(x = 148.64600000000002f, y = 147.18792217008468f),
156 | Offset(x = 148.64600000000002f, y = 150.20080109449157f),
157 | Offset(x = 148.64600000000002f, y = 153.2009444998826f),
158 | Offset(x = 148.64600000000002f, y = 156.2000759019012f),
159 | Offset(x = 148.64600000000002f, y = 159.19445944318198f),
160 | Offset(x = 148.64600000000002f, y = 162.195911349918f),
161 | Offset(x = 148.64600000000002f, y = 165.20403300276132f),
162 | Offset(x = 148.64600000000002f, y = 168.19591210101473f),
163 | Offset(x = 148.64600000000002f, y = 171.18671126735558f),
164 | Offset(x = 148.64600000000002f, y = 174.18921248014271f),
165 | Offset(x = 148.64600000000002f, y = 177.20045669061906f),
166 | Offset(x = 148.64600000000002f, y = 180.19868097012454f),
167 | Offset(x = 148.64600000000002f, y = 183.20432466608816f),
168 | Offset(x = 148.64600000000002f, y = 186.19250484583503f),
169 | Offset(x = 148.64600000000002f, y = 189.19998426836258f),
170 | Offset(x = 148.64600000000002f, y = 192.18931985902228f),
171 | Offset(x = 148.646f, y = 195.19446181146913f),
172 | Offset(x = 148.64600000000002f, y = 198.19416595587947f),
173 | Offset(x = 148.64600000000002f, y = 201.19906935093294f),
174 | Offset(x = 148.64600000000002f, y = 204.19571516577713f),
175 | Offset(x = 148.64600000000002f, y = 207.19909548598147f),
176 | Offset(x = 148.64600000000002f, y = 210.20578239049013f),
177 | Offset(x = 148.64600000000002f, y = 213.18971471395528f),
178 | Offset(x = 148.64600000000002f, y = 216.18977275986387f),
179 | Offset(x = 148.64600000000002f, y = 219.19724111895607f),
180 | Offset(x = 148.64600000000002f, y = 222.20401023948193f),
181 | Offset(x = 148.64600000000002f, y = 225.2025527956759f),
182 | Offset(x = 148.64600000000002f, y = 228.19966731870568f),
183 | Offset(x = 148.64600000000002f, y = 231.20326560291326f),
184 | Offset(x = 148.64600000000004f, y = 234.19406559010338f),
185 | Offset(x = 148.64600000000002f, y = 237.19503717619463f),
186 | Offset(x = 148.64600000000002f, y = 240.18751054229776f),
187 | Offset(x = 148.64600000000004f, y = 243.19553667823556f),
188 | Offset(x = 148.64600000000002f, y = 246.20076238774328f),
189 | Offset(x = 148.64600000000002f, y = 249.19908798006412f),
190 | Offset(x = 148.64600000000002f, y = 252.20089180154739f),
191 | Offset(x = 148.64600000000002f, y = 255.20226551942457f),
192 | Offset(x = 148.64600000000002f, y = 258.19930080092706f),
193 | Offset(x = 148.64600000000002f, y = 261.1880893132863f),
194 | Offset(x = 148.646f, y = 264.1931358927645f),
195 | Offset(x = 148.64600000000002f, y = 267.19589069498613f),
196 | Offset(x = 148.64600000000002f, y = 270.1920112311124f),
197 | Offset(x = 148.64600000000002f, y = 273.2048029137759f),
198 | Offset(x = 148.64600000000002f, y = 276.1875939846941f),
199 | Offset(x = 148.64600000000002f, y = 279.19032052697935f),
200 | Offset(x = 148.64600000000002f, y = 282.2063557814697f),
201 | Offset(x = 148.64600000000002f, y = 285.202240272836f),
202 | Offset(x = 148.64600000000002f, y = 288.19750885701524f),
203 | Offset(x = 148.64600000000002f, y = 291.19661609956466f),
204 | Offset(x = 148.64600000000002f, y = 294.20219068052336f),
205 | Offset(x = 148.64600000000002f, y = 297.19073612544975f),
206 | Offset(x = 148.64600000000002f, y = 300.19719949435216f),
207 | Offset(x = 148.64600000000002f, y = 303.1930703298791f),
208 | Offset(x = 148.64600000000002f, y = 306.19261889951076f),
209 | Offset(x = 148.64600000000002f, y = 309.20211065543845f),
210 | Offset(x = 148.64600000000002f, y = 312.1891399953172f),
211 | Offset(x = 148.64600000000002f, y = 315.2062674012964f),
212 | Offset(x = 148.64600000000002f, y = 318.205703808517f),
213 | Offset(x = 148.64600000000002f, y = 321.19366700348473f),
214 | Offset(x = 148.64600000000002f, y = 324.19531572731495f),
215 | Offset(x = 148.64600000000002f, y = 327.18780309160053f),
216 | Offset(x = 148.64600000000002f, y = 330.1937028556894f),
217 | Offset(x = 145.76786760269107f, y = 330.322f),
218 | Offset(x = 142.76750340974334f, y = 330.322f),
219 | Offset(x = 139.77333753961875f, y = 330.322f),
220 | Offset(x = 136.7777799463123f, y = 330.322f),
221 | Offset(x = 133.7796662064791f, y = 330.322f),
222 | Offset(x = 130.7751796884831f, y = 330.32200000000006f),
223 | Offset(x = 127.77637062062324f, y = 330.322f),
224 | Offset(x = 124.77858902889746f, y = 330.322f),
225 | Offset(x = 121.7688861684818f, y = 330.322f),
226 | Offset(x = 118.76904052361121f, y = 330.322f),
227 | Offset(x = 115.76843857008197f, y = 330.322f),
228 | Offset(x = 112.76764546065033f, y = 330.322f),
229 | Offset(x = 109.77215966779485f, y = 330.322f),
230 | Offset(x = 106.77109698437042f, y = 330.322f),
231 | Offset(x = 103.76960079580903f, y = 330.322f),
232 | Offset(x = 100.77397584361395f, y = 330.322f),
233 | Offset(x = 97.77830874738231f, y = 330.32994273000276f),
234 | Offset(x = 94.77680292955029f, y = 330.40727400166634f),
235 | Offset(x = 91.77826500475342f, y = 330.5672983180621f),
236 | Offset(x = 88.78447375905671f, y = 330.81042720755033f),
237 | Offset(x = 85.79726331269694f, y = 331.13703491194974f),
238 | Offset(x = 82.83764908723026f, y = 331.544549744867f),
239 | Offset(x = 79.86913314578885f, y = 332.0385649594364f),
240 | Offset(x = 76.93175637123204f, y = 332.61301616112576f),
241 | Offset(x = 74.00842607976564f, y = 333.27104397787207f),
242 | Offset(x = 71.1012336714657f, y = 334.01284055883724f),
243 | Offset(x = 68.21233040222526f, y = 334.8385566219761f),
244 | Offset(x = 65.34392827013134f, y = 335.7483006415591f),
245 | Offset(x = 62.51584640929102f, y = 336.73572531000525f),
246 | Offset(x = 59.712337610008944f, y = 337.80631147916966f),
247 | Offset(x = 56.95276656990865f, y = 338.95269987705683f),
248 | Offset(x = 54.20527159908002f, y = 340.1890861876379f),
249 | Offset(x = 51.50603230362013f, y = 341.500218613117f),
250 | Offset(x = 48.85666837759436f, y = 342.8846124969547f),
251 | Offset(x = 46.24302394148597f, y = 344.3499352059971f),
252 | Offset(x = 43.66771743994532f, y = 345.8959898257941f),
253 | Offset(x = 41.13343404005718f, y = 347.5225317165564f),
254 | Offset(x = 38.65766009649634f, y = 349.2188407054618f),
255 | Offset(x = 36.242106390355445f, y = 350.98334864307344f),
256 | Offset(x = 33.87449638215187f, y = 352.82571706298097f),
257 | Offset(x = 31.571307682219427f, y = 354.73392482033336f),
258 | Offset(x = 29.32108960138494f, y = 356.7183766144932f),
259 | Offset(x = 27.126827109553695f, y = 358.77859330097306f),
260 | Offset(x = 25.00392180761188f, y = 360.90130098566067f),
261 | Offset(x = 22.954178916204377f, y = 363.08484495320414f),
262 | Offset(x = 20.967945297660822f, y = 365.3410138902348f),
263 | Offset(x = 19.059406581996278f, y = 367.65538257731225f),
264 | Offset(x = 17.23040022518389f, y = 370.0262667512878f),
265 | Offset(x = 15.47272783371806f, y = 372.46640994838623f),
266 | Offset(x = 13.808793453135703f, y = 374.9455799530381f),
267 | Offset(x = 12.220882354865745f, y = 377.4912376544004f),
268 | Offset(x = 10.720900461167096f, y = 380.08724109248067f),
269 | Offset(x = 9.3027389467475f, y = 382.7474814668413f),
270 | Offset(x = 7.98476725862886f, y = 385.43930322587454f),
271 | Offset(x = 6.760345929520146f, y = 388.1763182154373f),
272 | Offset(x = 5.631345032201519f, y = 390.95681227491036f),
273 | Offset(x = 4.599634639453143f, y = 393.7790712436745f),
274 | Offset(x = 3.6722464706617757f, y = 396.6245291973688f),
275 | Offset(x = 2.8446999535080977f, y = 399.5078865764554f),
276 | Offset(x = 2.122801484084652f, y = 402.41018254643154f),
277 | Offset(x = 1.5031946364297182f, y = 405.34661415568706f),
278 | Offset(x = 0.9876846311881745f, y = 408.31552668887025f),
279 | Offset(x = 0.5822979014251032f, y = 411.2795917309458f),
280 | Offset(x = 0.2820633941657943f, y = 414.272161023885f),
281 | Offset(x = 0.09039920072880339f, y = 417.25532357351125f),
282 | Offset(x = 0.004764157933364913f, y = 420.2632130997406f),
283 | Offset(x = 0.02618715382322989f, y = 423.26485291229267f),
284 | Offset(x = 0.1544354627840221f, y = 426.26309395670796f),
285 | Offset(x = 0.38977446724608306f, y = 429.25392673871227f),
286 | Offset(x = 0.7300407475610263f, y = 432.217537820703f),
287 | Offset(x = 1.1794889708398841f, y = 435.18753641076f),
288 | Offset(x = 1.7364841126519386f, y = 438.14381868644847f),
289 | Offset(x = 2.3968604176868102f, y = 441.0669614732452f),
290 | Offset(x = 3.163619964990765f, y = 443.9722940324964f),
291 | Offset(x = 4.031323637516296f, y = 446.8407351403831f),
292 | Offset(x = 4.998133979290258f, y = 449.6706005337568f),
293 | Offset(x = 6.068756959912476f, y = 452.476492953179f),
294 | Offset(x = 7.235926790432131f, y = 455.2399361944458f),
295 | Offset(x = 8.49777339806906f, y = 457.9592160969379f),
296 | Offset(x = 9.852426710043101f, y = 460.6326185000362f),
297 | Offset(x = 11.306734170062931f, y = 463.27364152000666f),
298 | Offset(x = 12.841906029413622f, y = 465.849853062851f),
299 | Offset(x = 14.464263438662805f, y = 468.37503460011294f),
300 | Offset(x = 16.16170554570714f, y = 470.83316990610786f),
301 | Offset(x = 17.952341287664304f, y = 473.2514724029495f),
302 | Offset(x = 19.81338108273433f, y = 475.5999653218553f),
303 | Offset(x = 21.75321825426726f, y = 477.8912664647421f),
304 | Offset(x = 23.7579303838904f, y = 480.1107350756855f),
305 | Offset(x = 25.836894465502155f, y = 482.27036355416084f),
306 | Offset(x = 27.98830527845764f, y = 484.3684971848162f),
307 | Offset(x = 30.197005130688368f, y = 486.39162888879036f),
308 | Offset(x = 32.47373960821278f, y = 488.35073063548725f),
309 | Offset(x = 34.81673534647952f, y = 490.24417690973473f),
310 | Offset(x = 37.19518608667096f, y = 492.04900418357727f),
311 | Offset(x = 39.63488765530201f, y = 493.78657471335055f),
312 | Offset(x = 42.13412927128002f, y = 495.45532034961786f),
313 | Offset(x = 44.67562638114448f, y = 497.04425818332504f),
314 | Offset(x = 47.272578068485075f, y = 498.56210854872825f),
315 | Offset(x = 49.907080674420286f, y = 499.9987943714722f),
316 | Offset(x = 52.57652771478054f, y = 501.3541297444036f),
317 | Offset(x = 55.29520423430344f, y = 502.6356092425714f),
318 | Offset(x = 58.04437759281875f, y = 503.83458128019413f),
319 | Offset(x = 60.821601478100106f, y = 504.95097989903866f),
320 | Offset(x = 63.6421426795423f, y = 505.99100525634736f),
321 | Offset(x = 66.4865364767611f, y = 506.9474932079986f),
322 | Offset(x = 69.35249200362485f, y = 507.82049341283516f),
323 | Offset(x = 72.25615689431591f, y = 508.6148459918012f),
324 | Offset(x = 75.1588296241307f, y = 509.3206903278074f),
325 | Offset(x = 78.09535591310635f, y = 509.9471829152899f),
326 | Offset(x = 81.04527852425771f, y = 510.4897786541494f),
327 | Offset(x = 84.00657588450697f, y = 510.94872030645877f),
328 | Offset(x = 86.99666465654951f, y = 511.32646449488055f),
329 | Offset(x = 89.97504818354734f, y = 511.6184552824441f),
330 | Offset(x = 92.95907666851309f, y = 511.8277511448733f),
331 | Offset(x = 95.96681804543095f, y = 511.955318842478f),
332 | Offset(x = 98.95694884937711f, y = 511.9999107579169f),
333 | Offset(x = 101.96888253501058f, y = 511.9623965220079f),
334 | Offset(x = 104.95886598781856f, y = 511.8429362570662f),
335 | Offset(x = 107.94513346992566f, y = 511.6411176521634f),
336 | Offset(x = 110.94528903022513f, y = 511.3544153195748f),
337 | Offset(x = 113.91851360124957f, y = 510.98619396832623f),
338 | Offset(x = 116.88246869231475f, y = 510.5345338345378f),
339 | Offset(x = 119.83519319540385f, y = 509.99915016674794f),
340 | Offset(x = 122.774667987879f, y = 509.3797979567426f),
341 | Offset(x = 125.680418282934f, y = 508.6809756966395f),
342 | Offset(x = 128.58733148187855f, y = 507.8936140750604f),
343 | Offset(x = 131.4566676878776f, y = 507.02748349278613f),
344 | Offset(x = 134.30459704864634f, y = 506.07778588697806f),
345 | Offset(x = 137.11142103993666f, y = 505.05112498631377f),
346 | Offset(x = 139.90988377975344f, y = 503.9346550351329f),
347 | Offset(x = 142.6630465910753f, y = 502.742182685131f),
348 | Offset(x = 145.36931940764563f, y = 501.4751654351754f),
349 | Offset(x = 148.05961480009324f, y = 500.1180656651027f),
350 | Offset(x = 150.68264366403434f, y = 498.69651672471355f),
351 | Offset(x = 153.2845533683733f, y = 497.1852052190619f),
352 | Offset(x = 155.8311612269852f, y = 495.6026662469458f),
353 | Offset(x = 158.3356986889699f, y = 493.94021697980645f),
354 | Offset(x = 160.78085069226054f, y = 492.2088011189108f),
355 | Offset(x = 163.179079637663f, y = 490.3989495300484f),
356 | Offset(x = 165.51373214138908f, y = 488.5224816820979f),
357 | Offset(x = 167.79645490239184f, y = 486.5691759427675f),
358 | Offset(x = 170.01130137422157f, y = 484.5516951108766f),
359 | Offset(x = 172.16905514643852f, y = 482.4590995547428f),
360 | Offset(x = 174.2545224139962f, y = 480.3048622825625f),
361 | Offset(x = 176.26589795624972f, y = 478.0906380096876f),
362 | Offset(x = 178.21259962050988f, y = 475.80446406209376f),
363 | Offset(x = 180.0806660367754f, y = 473.4609497270267f),
364 | Offset(x = 181.86825974907305f, y = 471.06177926763485f),
365 | Offset(x = 183.5833272336855f, y = 468.5940503552583f),
366 | Offset(x = 185.2132432826516f, y = 466.07342691171345f),
367 | Offset(x = 186.75613782319107f, y = 463.5016230976197f),
368 | Offset(x = 188.2101407825239f, y = 460.880353073596f),
369 | Offset(x = 189.58108364492887f, y = 458.19558561245435f),
370 | Offset(x = 190.8439916664487f, y = 455.4962710382358f),
371 | Offset(x = 192.0266956543804f, y = 452.7206236127758f),
372 | Offset(x = 193.0998353521847f, y = 449.9348940905862f),
373 | Offset(x = 194.0813293137815f, y = 447.09200542620084f),
374 | Offset(x = 194.95785160392478f, y = 444.22690030849054f),
375 | Offset(x = 195.73359189731468f, y = 441.3247551279615f),
376 | Offset(x = 196.40305682124523f, y = 438.4046336678524f),
377 | Offset(x = 196.96930080863743f, y = 435.4512258506251f),
378 | Offset(x = 197.42810195795863f, y = 432.4839391431658f),
379 | Offset(x = 197.7795559819029f, y = 429.5049428194071f),
380 | Offset(x = 198.02381033184918f, y = 426.51634529360217f),
381 | Offset(x = 198.16106326099478f, y = 423.52019497908316f),
382 | Offset(x = 198.194f, y = 420.5283171188589f),
383 | Offset(x = 198.194f, y = 417.5267768067384f),
384 | Offset(x = 198.19399999999996f, y = 414.5239521973897f),
385 | Offset(x = 198.194f, y = 411.5192301910233f),
386 | Offset(x = 198.19400000000002f, y = 408.52068850671645f),
387 | Offset(x = 198.19400000000002f, y = 405.52544462350846f),
388 | Offset(x = 198.19399999999996f, y = 402.5163565026341f),
389 | Offset(x = 198.194f, y = 399.5288481149674f),
390 | Offset(x = 198.194f, y = 396.5256093356251f),
391 | Offset(x = 198.194f, y = 393.52628398990635f),
392 | Offset(x = 198.194f, y = 390.5218131958849f),
393 | Offset(x = 198.19400000000002f, y = 387.52368690323533f),
394 | Offset(x = 198.194f, y = 384.52999522863695f),
395 | Offset(x = 198.194f, y = 381.527091689903f),
396 | Offset(x = 198.19400000000002f, y = 378.52753304556967f),
397 | Offset(x = 198.19399999999996f, y = 375.5243851613327f),
398 | Offset(x = 198.19399999999996f, y = 372.51860250753964f),
399 | Offset(x = 198.19399999999996f, y = 369.5330030533579f),
400 | Offset(x = 198.194f, y = 366.5282226051707f),
401 | Offset(x = 198.194f, y = 363.5302819958087f),
402 | Offset(x = 198.19400000000002f, y = 360.53044877514037f),
403 | Offset(x = 198.19399999999996f, y = 357.5256393377334f),
404 | Offset(x = 198.19399999999996f, y = 354.5306472423459f),
405 | Offset(x = 198.194f, y = 351.5185181362405f),
406 | Offset(x = 198.194f, y = 348.52983377977705f),
407 | Offset(x = 198.194f, y = 345.5213070552293f),
408 | Offset(x = 198.194f, y = 342.5346530557574f),
409 | Offset(x = 198.194f, y = 339.5234291076831f),
410 | Offset(x = 198.194f, y = 336.5268907117173f),
411 | Offset(x = 198.194f, y = 333.53251314079114f),
412 | Offset(x = 198.194f, y = 330.52169568430736f),
413 | Offset(x = 198.194f, y = 327.52651180562725f),
414 | Offset(x = 198.194f, y = 324.5278688288331f),
415 | Offset(x = 198.194f, y = 321.52157403033243f),
416 | Offset(x = 198.19399999999996f, y = 318.5236539534876f),
417 | Offset(x = 198.19399999999996f, y = 315.52284475093427f),
418 | Offset(x = 198.19400000000002f, y = 312.53050076026403f),
419 | Offset(x = 198.194f, y = 309.5301860771179f),
420 | Offset(x = 198.194f, y = 306.5299810398489f),
421 | Offset(x = 198.194f, y = 303.5235609224212f),
422 | Offset(x = 198.194f, y = 300.5313447247669f),
423 | Offset(x = 198.19400000000002f, y = 297.51733632182265f),
424 | Offset(x = 198.194f, y = 294.5291838302547f),
425 | Offset(x = 198.194f, y = 291.52932886526054f),
426 | Offset(x = 198.19399999999996f, y = 288.5221122464375f),
427 | Offset(x = 198.19400000000002f, y = 285.5263377955102f),
428 | Offset(x = 198.194f, y = 282.5316501285241f),
429 | Offset(x = 198.19399999999996f, y = 279.5273184633406f),
430 | Offset(x = 198.194f, y = 276.51711573818574f),
431 | Offset(x = 198.19399999999996f, y = 273.51950804412286f),
432 | Offset(x = 198.194f, y = 270.52354064126297f),
433 | Offset(x = 198.194f, y = 267.53293152299926f),
434 | Offset(x = 198.194f, y = 264.5222252259254f),
435 | Offset(x = 198.194f, y = 261.5246024671892f),
436 | Offset(x = 198.19399999999996f, y = 258.529469686373f),
437 | Offset(x = 198.194f, y = 255.52667687664268f),
438 | Offset(x = 198.194f, y = 252.52089354253314f),
439 | Offset(x = 198.194f, y = 249.51702792561028f),
440 | Offset(x = 198.19400000000002f, y = 246.53408242608387f),
441 | Offset(x = 198.19400000000002f, y = 243.5222578967821f),
442 | Offset(x = 198.194f, y = 240.52942452940238f),
443 | Offset(x = 198.194f, y = 237.52209566915695f),
444 | Offset(x = 198.19400000000002f, y = 234.52197031542065f),
445 | Offset(x = 198.19400000000002f, y = 231.52509920434176f),
446 | Offset(x = 198.19400000000002f, y = 228.52950752732065f),
447 | Offset(x = 198.194f, y = 225.52367542790748f),
448 | Offset(x = 198.194f, y = 222.52343110527934f),
449 | Offset(x = 198.194f, y = 219.52425101155188f),
450 | Offset(x = 198.194f, y = 216.5274730087266f),
451 | Offset(x = 198.19400000000002f, y = 213.531628743324f),
452 | Offset(x = 198.19399999999996f, y = 210.5279921510852f),
453 | Offset(x = 198.194f, y = 207.51932682558612f),
454 | Offset(x = 198.19400000000002f, y = 204.52247142799396f),
455 | Offset(x = 198.19400000000002f, y = 201.52345077629334f),
456 | Offset(x = 198.19400000000002f, y = 198.51577692866232f),
457 | Offset(x = 198.194f, y = 195.5306028332114f),
458 | Offset(x = 200.22550340443226f, y = 194.26723589995407f),
459 | Offset(x = 203.19330111575238f, y = 193.798635670236f),
460 | Offset(x = 206.15668526090693f, y = 193.33073232026527f),
461 | Offset(x = 209.12900061096107f, y = 192.86141877826842f),
462 | Offset(x = 212.0758612739662f, y = 192.39612440245426f),
463 | Offset(x = 215.05082803024567f, y = 191.92639221684112f),
464 | Offset(x = 218.01574339756115f, y = 191.4582470946452f),
465 | Offset(x = 220.98186180478478f, y = 190.98991201854005f),
466 | Offset(x = 223.93789304067843f, y = 190.52316965570648f),
467 | Offset(x = 226.8984490787973f, y = 190.05571284951517f),
468 | Offset(x = 229.87274789537597f, y = 189.58608612819833f),
469 | Offset(x = 232.8259485686674f, y = 189.11979069686575f),
470 | Offset(x = 235.79260417307572f, y = 188.65137080004547f),
471 | Offset(x = 238.7608765671388f, y = 188.18269562032611f),
472 | Offset(x = 241.71978198288517f, y = 187.71549943904867f),
473 | Offset(x = 244.6780883163386f, y = 187.24839784983152f),
474 | Offset(x = 247.64698449833315f, y = 186.7796241771566f),
475 | Offset(x = 250.60027046392764f, y = 186.31331527860127f),
476 | Offset(x = 253.57101403423482f, y = 185.84424991266698f),
477 | Offset(x = 256.53414657839124f, y = 185.3763862892197f),
478 | Offset(x = 259.50510005012893f, y = 184.90728778091244f),
479 | Offset(x = 262.4586632433478f, y = 184.44093510951916f),
480 | Offset(x = 265.43283874143157f, y = 183.97132785956816f),
481 | Offset(x = 268.3814657603746f, y = 183.50575458509627f),
482 | Offset(x = 271.34408504641635f, y = 183.03797200250617f),
483 | Offset(x = 274.3181222996117f, y = 182.568386580723f),
484 | Offset(x = 277.278717211606f, y = 182.1009236365436f),
485 | Offset(x = 280.24541769157133f, y = 181.6324966541001f),
486 | Offset(x = 283.20455633574437f, y = 181.16526364723512f),
487 | Offset(x = 286.1651366350357f, y = 180.69780301032753f),
488 | Offset(x = 289.1366126258373f, y = 180.22862199890614f),
489 | Offset(x = 292.0939157412767f, y = 179.7616788127331f),
490 | Offset(x = 295.05827301316486f, y = 179.293621810979f),
491 | Offset(x = 298.0279963596922f, y = 178.82471753321315f),
492 | Offset(x = 300.97777761076316f, y = 178.35896201133326f),
493 | Offset(x = 303.94132590911227f, y = 177.89103274240435f),
494 | Offset(x = 306.91723300522256f, y = 177.42115208189378f),
495 | Offset(x = 309.88015604703503f, y = 176.95332153780572f),
496 | Offset(x = 312.82847609828696f, y = 176.48779673197774f),
497 | Offset(x = 315.80876782503833f, y = 176.01722376049267f),
498 | Offset(x = 318.77161117149456f, y = 175.54940579989778f),
499 | Offset(x = 321.7275946955491f, y = 175.08267097052203f),
500 | Offset(x = 324.6874246807896f, y = 174.61532880440345f),
501 | Offset(x = 327.6618702742509f, y = 174.14567890776016f),
502 | Offset(x = 330.61332230211076f, y = 173.67965957868608f),
503 | Offset(x = 333.58883257006073f, y = 173.20984157533252f),
504 | Offset(x = 336.5387005700229f, y = 172.744072356242f),
505 | Offset(x = 339.5099521400184f, y = 172.2749267797294f),
506 | Offset(x = 342.47705853003913f, y = 171.80643570614367f),
507 | Offset(x = 345.4386780107775f, y = 171.338810987748f),
508 | Offset(x = 348.3934688529259f, y = 170.8722644768055f),
509 | Offset(x = 351.3640084277079f, y = 170.40323132073158f),
510 | Offset(x = 354.32486952184354f, y = 169.93572634774f),
511 | Offset(x = 357.2865475673307f, y = 169.46809238226706f),
512 | Offset(x = 360.2593250672178f, y = 168.99870586915185f),
513 | Offset(x = 363.20618391889104f, y = 168.53341177933788f),
514 | Offset(x = 366.1843549284012f, y = 168.0631736583659f),
515 | Offset(x = 369.14509347914236f, y = 167.59568803435576f),
516 | Offset(x = 372.1100076924593f, y = 167.12754309437037f),
517 | Offset(x = 375.06565960849696f, y = 166.66086062422127f),
518 | Offset(x = 378.02163386195855f, y = 166.1941272586252f),
519 | Offset(x = 380.98708812026376f, y = 165.725897048271f),
520 | Offset(x = 383.9483544807008f, y = 165.2583280857827f),
521 | Offset(x = 386.9252460024375f, y = 164.7882919894508f),
522 | Offset(x = 389.8928101675548f, y = 164.31972863549552f),
523 | Offset(x = 392.8485496670236f, y = 163.85303233636614f),
524 | Offset(x = 395.8112139468703f, y = 163.38524264948208f),
525 | Offset(x = 398.7772663336741f, y = 162.91691799766684f),
526 | Offset(x = 401.7429785866556f, y = 162.44864705125974f),
527 | Offset(x = 404.70442484107684f, y = 161.9810496844223f),
528 | Offset(x = 407.6574754651193f, y = 161.5147779451063f),
529 | Offset(x = 410.6174704098843f, y = 161.0474097327142f),
530 | Offset(x = 413.5979540999567f, y = 160.5768064511928f),
531 | Offset(x = 416.5538444771307f, y = 160.1100863292378f),
532 | Offset(x = 419.5167500681255f, y = 159.64225854054547f),
533 | Offset(x = 422.4783680991254f, y = 159.17463405105613f),
534 | Offset(x = 425.447222517862f, y = 158.70586697258818f),
535 | Offset(x = 428.412162337256f, y = 158.23771798953294f),
536 | Offset(x = 431.3611730036847f, y = 157.7720841390658f),
537 | Offset(x = 434.32823323268326f, y = 157.30360035407176f),
538 | Offset(x = 437.29330209982703f, y = 156.8354309950303f),
539 | Offset(x = 440.262768191854f, y = 156.3665673364473f),
540 | Offset(x = 443.22101624459697f, y = 155.8994749494592f),
541 | Offset(x = 446.1954162145593f, y = 155.42983225653532f),
542 | Offset(x = 449.143590090623f, y = 154.96433053102936f),
543 | Offset(x = 452.1130763770832f, y = 154.49546368384762f),
544 | Offset(x = 455.07366561017426f, y = 154.02800163633827f),
545 | Offset(x = 458.0311462647193f, y = 153.56103041763953f),
546 | Offset(x = 460.99821042858485f, y = 153.0925460113499f),
547 | Offset(x = 462.45200000000006f, y = 154.39224169921877f),
548 | Offset(x = 462.452f, y = 157.39358631134036f),
549 | Offset(x = 462.452f, y = 160.40240036121565f),
550 | Offset(x = 462.45199999999994f, y = 163.40639883858353f),
551 | Offset(x = 462.452f, y = 166.4015582363933f),
552 | Offset(x = 462.45199999999994f, y = 169.38989274816416f),
553 | Offset(x = 462.452f, y = 172.39080278476908f),
554 | Offset(x = 462.452f, y = 175.38671959868606f),
555 | Offset(x = 462.452f, y = 178.39543499265633f),
556 | Offset(x = 462.452f, y = 181.38774824250686f),
557 | Offset(x = 462.452f, y = 184.40232057241283f),
558 | Offset(x = 462.45200000000006f, y = 187.40021854097958f),
559 | Offset(x = 462.452f, y = 190.3871266919249f),
560 | Offset(x = 462.452f, y = 193.39555048941259f),
561 | Offset(x = 462.452f, y = 196.39239283355346f),
562 | Offset(x = 462.452f, y = 199.39136368161994f),
563 | Offset(x = 462.45200000000006f, y = 202.396285616604f),
564 | Offset(x = 462.452f, y = 205.38774084060182f),
565 | Offset(x = 462.452f, y = 208.39543454069963f),
566 | Offset(x = 462.452f, y = 211.401167137146f),
567 | Offset(x = 462.45199999999994f, y = 214.3990567828344f),
568 | Offset(x = 462.452f, y = 217.39593982968202f),
569 | Offset(x = 462.452f, y = 220.39897292617277f),
570 | Offset(x = 462.452f, y = 223.39049603264056f),
571 | Offset(x = 462.452f, y = 226.4026869949048f),
572 | Offset(x = 462.452f, y = 229.40534770222266f),
573 | Offset(x = 462.452f, y = 232.3932125799434f),
574 | Offset(x = 462.452f, y = 235.39765895167483f),
575 | Offset(x = 462.452f, y = 238.40027109980787f),
576 | Offset(x = 462.452f, y = 241.39473916228354f),
577 | Offset(x = 462.452f, y = 244.39804354096418f),
578 | Offset(x = 462.452f, y = 247.39055685247882f),
579 | Offset(x = 462.452f, y = 250.39839713549975f),
580 | Offset(x = 462.452f, y = 253.3886191647094f),
581 | Offset(x = 462.452f, y = 256.3944867665544f),
582 | Offset(x = 462.452f, y = 259.40141599039015f),
583 | Offset(x = 462.452f, y = 262.3932320026297f),
584 | Offset(x = 462.452f, y = 265.39094380196724f),
585 | Offset(x = 462.452f, y = 268.3878547200665f),
586 | Offset(x = 462.452f, y = 271.4047122064092f),
587 | Offset(x = 462.452f, y = 274.3949005968443f),
588 | Offset(x = 462.452f, y = 277.39289073778343f),
589 | Offset(x = 462.452f, y = 280.3977652375998f),
590 | Offset(x = 462.452f, y = 283.3973244246382f),
591 | Offset(x = 462.452f, y = 286.40331327518106f),
592 | Offset(x = 462.0816632227898f, y = 289.03200000000004f),
593 | Offset(x = 459.0853187466934f, y = 289.032f),
594 | Offset(x = 456.0885359015676f, y = 289.03200000000004f),
595 | Offset(x = 453.08872431382173f, y = 289.0320000000001f),
596 | Offset(x = 450.0927081087032f, y = 289.03200000000004f),
597 | Offset(x = 447.08017426993416f, y = 289.03200000000004f),
598 | Offset(x = 444.0901603272642f, y = 289.03200000000004f),
599 | Offset(x = 441.07968181171265f, y = 289.03200000000004f),
600 | Offset(x = 438.0771750748819f, y = 289.03200000000004f),
601 | Offset(x = 435.0874790205263f, y = 289.03200000000004f),
602 | Offset(x = 432.09600365740897f, y = 289.03200000000004f),
603 | Offset(x = 429.09358008571246f, y = 289.03200000000004f),
604 | Offset(x = 426.0843571615154f, y = 289.03200000000004f),
605 | Offset(x = 423.0803054266805f, y = 289.03200000000004f),
606 | Offset(x = 420.082228130198f, y = 289.03200000000004f),
607 | Offset(x = 417.08573233255f, y = 289.03200000000004f),
608 | Offset(x = 414.07991849821803f, y = 289.03200000000004f),
609 | Offset(x = 411.0868627710934f, y = 289.0470421678215f),
610 | Offset(x = 408.08901260507196f, y = 289.13787434042007f),
611 | Offset(x = 405.09436985279405f, y = 289.3112936664293f),
612 | Offset(x = 402.10471756391075f, y = 289.5677078068578f),
613 | Offset(x = 399.12189415029474f, y = 289.9074871107294f),
614 | Offset(x = 396.1477942443676f, y = 290.3309638283169f),
615 | Offset(x = 393.2032674731198f, y = 290.83492146089594f),
616 | Offset(x = 390.252320691079f, y = 291.42612006000434f),
617 | Offset(x = 387.33459137819125f, y = 292.0972534653939f),
618 | Offset(x = 384.43327760443924f, y = 292.85201952852947f),
619 | Offset(x = 381.5505352348766f, y = 293.69056478485993f),
620 | Offset(x = 378.6885809059233f, y = 294.612993499678f),
621 | Offset(x = 375.86719578180714f, y = 295.61287697274537f),
622 | Offset(x = 373.07067684605147f, y = 296.69577180130926f),
623 | Offset(x = 370.3013938620046f, y = 297.86166875939864f),
624 | Offset(x = 367.5784414049524f, y = 299.1026234411172f),
625 | Offset(x = 364.8870491169272f, y = 300.4255184206803f),
626 | Offset(x = 362.229744584882f, y = 301.83022667574875f),
627 | Offset(x = 359.6248404906869f, y = 303.3073485843656f),
628 | Offset(x = 357.05860170989325f, y = 304.86502554374175f),
629 | Offset(x = 354.53371840807955f, y = 306.5030083765862f),
630 | Offset(x = 352.06762282216846f, y = 308.2105057108216f),
631 | Offset(x = 349.6620257332526f, y = 309.98594939701115f),
632 | Offset(x = 347.3047131009139f, y = 311.8390645596637f),
633 | Offset(x = 344.9985735867023f, y = 313.76944694370036f),
634 | Offset(x = 342.75968757292253f, y = 315.76457528574485f),
635 | Offset(x = 340.5898284241259f, y = 317.822824070625f),
636 | Offset(x = 338.46621431848985f, y = 319.96816666013456f),
637 | Offset(x = 336.428767331469f, y = 322.16163672858346f),
638 | Offset(x = 334.46658706543826f, y = 324.4140167640661f),
639 | Offset(x = 332.57055721892164f, y = 326.73748563602464f),
640 | Offset(x = 330.7439077925933f, y = 329.1313665121576f),
641 | Offset(x = 328.9998944993415f, y = 331.58044751561334f),
642 | Offset(x = 327.34984286913027f, y = 334.068227426256f),
643 | Offset(x = 325.7762014998635f, y = 336.6222684262541f),
644 | Offset(x = 324.2907955459156f, y = 339.2263770960485f),
645 | Offset(x = 322.88760411270334f, y = 341.8944895902788f),
646 | Offset(x = 321.5848225765369f, y = 344.59385882106017f),
647 | Offset(x = 320.375897610128f, y = 347.338143215449f),
648 | Offset(x = 319.2626992862568f, y = 350.1256286128264f),
649 | Offset(x = 318.2527495532661f, y = 352.9379398702929f),
650 | Offset(x = 317.33602761961527f, y = 355.8064571858621f),
651 | Offset(x = 316.52510185297206f, y = 358.6959381203568f),
652 | Offset(x = 315.82002633963054f, y = 361.60404922080477f),
653 | Offset(x = 315.2175415378685f, y = 364.5460243600618f),
654 | Offset(x = 314.72208937458686f, y = 367.5025186029846f),
655 | Offset(x = 314.33358525831915f, y = 370.47135248161476f),
656 | Offset(x = 314.05051498675346f, y = 373.46843496185545f),
657 | Offset(x = 313.87608605261397f, y = 376.4558055735507f),
658 | Offset(x = 313.8079611862644f, y = 379.46765359926474f),
659 | Offset(x = 313.84689330566385f, y = 382.4671440481243f),
660 | Offset(x = 313.99249683776867f, y = 385.46134304345446f),
661 | Offset(x = 314.2450188271013f, y = 388.4478549869102f),
662 | Offset(x = 314.6046551055908f, y = 391.4246292457581f),
663 | Offset(x = 315.0715506887623f, y = 394.38955517297336f),
664 | Offset(x = 315.64209596863384f, y = 397.32309690595423f),
665 | Offset(x = 316.32312906238883f, y = 400.2579536810765f),
666 | Offset(x = 317.10173613867505f, y = 403.14037775540453f),
667 | Offset(x = 317.9907946180878f, y = 406.01952917938047f),
668 | Offset(x = 318.97375216808547f, y = 408.8428793762653f),
669 | Offset(x = 320.06031202511457f, y = 411.6419384139479f),
670 | Offset(x = 321.24311252129354f, y = 414.398267592204f),
671 | Offset(x = 322.5202835838421f, y = 417.1101527504145f),
672 | Offset(x = 323.8899551399802f, y = 419.7758797279603f),
673 | Offset(x = 325.3590597681105f, y = 422.4088992886618f),
674 | Offset(x = 326.89931944190414f, y = 424.9620024985807f),
675 | Offset(x = 328.54509088988806f, y = 427.4935348284862f),
676 | Offset(x = 330.2562448448241f, y = 429.94292261911187f),
677 | Offset(x = 332.0495792569265f, y = 432.33821965939785f),
678 | Offset(x = 333.93451236032f, y = 434.6913352396747f),
679 | Offset(x = 335.8754396287379f, y = 436.959804436357f),
680 | Offset(x = 337.90429067650064f, y = 439.18272364673305f),
681 | Offset(x = 339.9953825350905f, y = 441.33227799573876f),
682 | Offset(x = 342.1586220352131f, y = 443.42006334290176f),
683 | Offset(x = 344.37878414197553f, y = 445.4326362703278f),
684 | Offset(x = 346.66668531327304f, y = 447.38090832128125f),
685 | Offset(x = 349.0063494015742f, y = 449.2522477802157f),
686 | Offset(x = 351.4094543356784f, y = 451.0568466891209f),
687 | Offset(x = 353.8593187497565f, y = 452.7829181464489f),
688 | Offset(x = 356.3531455008117f, y = 454.4301283510022f),
689 | Offset(x = 358.9038319614343f, y = 456.00753907032964f),
690 | Offset(x = 361.5096980823847f, y = 457.513610324664f),
691 | Offset(x = 364.15278867210895f, y = 458.9383387144528f),
692 | Offset(x = 366.83050221463714f, y = 460.2815428865325f),
693 | Offset(x = 369.54030289317313f, y = 461.5430882748615f),
694 | Offset(x = 372.296875783775f, y = 462.7299808003577f),
695 | Offset(x = 375.09863082018614f, y = 463.8407629641538f),
696 | Offset(x = 377.90859085193307f, y = 464.8617003252366f),
697 | Offset(x = 380.7595413607353f, y = 465.8055690778789f),
698 | Offset(x = 383.6317660150419f, y = 466.66580290899344f),
699 | Offset(x = 386.52304032894676f, y = 467.4424988888161f),
700 | Offset(x = 389.4498332496782f, y = 468.139958719745f),
701 | Offset(x = 392.39182617088926f, y = 468.75318220990846f),
702 | Offset(x = 395.3469431940051f, y = 469.28237575968524f),
703 | Offset(x = 398.313167296765f, y = 469.7277863025534f),
704 | Offset(x = 401.2885394580653f, y = 470.0897005028969f),
705 | Offset(x = 404.27115778841215f, y = 470.3684439589548f),
706 | Offset(x = 407.2591766659845f, y = 470.5643804109121f),
707 | Offset(x = 410.25080587830695f, y = 470.67791095413355f),
708 | Offset(x = 413.26404103907277f, y = 470.709410098673f),
709 | Offset(x = 416.25261381546966f, y = 470.65885495519456f),
710 | Offset(x = 419.2586799993515f, y = 470.5253291463852f),
711 | Offset(x = 422.240936337458f, y = 470.3101604742129f),
712 | Offset(x = 425.2368058080583f, y = 470.0101326103533f),
713 | Offset(x = 428.20552074919664f, y = 469.6287873501389f),
714 | Offset(x = 431.164711285499f, y = 469.16412179861646f),
715 | Offset(x = 434.1312055112503f, y = 468.61208271768203f),
716 | Offset(x = 437.04659947454934f, y = 467.9837469040156f),
717 | Offset(x = 439.96519131839034f, y = 467.267596338223f),
718 | Offset(x = 442.8660453837599f, y = 466.4672446453763f),
719 | Offset(x = 445.7290752278634f, y = 465.58834836306175f),
720 | Offset(x = 448.5704090872866f, y = 464.62603139530063f),
721 | Offset(x = 451.3877540070629f, y = 463.5802461774344f),
722 | Offset(x = 454.1616641171555f, y = 462.4581937502247f),
723 | Offset(x = 456.90738461971284f, y = 461.2536399679184f),
724 | Offset(x = 459.62246709496424f, y = 459.96665292021214f),
725 | Offset(x = 462.2881999421586f, y = 458.60591912391675f),
726 | Offset(x = 464.9188444072443f, y = 457.1639120345004f),
727 | Offset(x = 467.51179188007416f, y = 455.64081972827256f),
728 | Offset(x = 470.0491619523836f, y = 454.0467522128539f),
729 | Offset(x = 472.54412767573115f, y = 452.3729592363273f),
730 | Offset(x = 474.9794292345047f, y = 450.63045528888705f),
731 | Offset(x = 477.3674672669524f, y = 448.8097069065341f),
732 | Offset(x = 479.6916469865438f, y = 446.92260128107984f),
733 | Offset(x = 481.96354994690114f, y = 444.95885556627394f),
734 | Offset(x = 484.1672915674792f, y = 442.9311971957448f),
735 | Offset(x = 486.31358689202136f, y = 440.8286284620072f),
736 | Offset(x = 488.3873074678331f, y = 438.6646838977486f),
737 | Offset(x = 490.398253645101f, y = 436.4276861505664f),
738 | Offset(x = 492.3320997702971f, y = 434.1319430223766f),
739 | Offset(x = 494.18700849468837f, y = 431.77913893718824f),
740 | Offset(x = 495.9611424695421f, y = 429.3709583190102f),
741 | Offset(x = 497.6623664342817f, y = 426.89444847266896f),
742 | Offset(x = 499.27813357152615f, y = 424.3653273119535f),
743 | Offset(x = 500.80657391763935f, y = 421.7853091611987f),
744 | Offset(x = 502.24581750898506f, y = 419.15610834474f),
745 | Offset(x = 503.60160694588717f, y = 416.4636499140412f),
746 | Offset(x = 504.8492345728292f, y = 413.7570160120509f),
747 | Offset(x = 506.0161717684083f, y = 410.97424884612184f),
748 | Offset(x = 507.073425053969f, y = 408.18176490856706f),
749 | Offset(x = 508.03863541693437f, y = 405.332365628615f),
750 | Offset(x = 508.8986674812709f, y = 402.46107000433693f),
751 | Offset(x = 509.6576166886055f, y = 399.553015686557f),
752 | Offset(x = 510.3100911928583f, y = 396.6272988994736f),
753 | Offset(x = 510.8561073608398f, y = 393.6861752319336f),
754 | Offset(x = 511.2980536527466f, y = 390.71405873471315f),
755 | Offset(x = 511.6324728148149f, y = 387.73052473759367f),
756 | Offset(x = 511.8595174200285f, y = 384.7376770889227f),
757 | Offset(x = 511.97939080950476f, y = 381.7375596589425f),
758 | Offset(x = 512f, y = 378.7520380997043f),
759 | Offset(x = 512f, y = 375.73833836829664f),
760 | Offset(x = 512f, y = 372.7381176607627f),
761 | Offset(x = 512f, y = 369.7472247196854f),
762 | Offset(x = 512f, y = 366.7396936200504f),
763 | Offset(x = 512f, y = 363.75193935757756f),
764 | Offset(x = 512f, y = 360.74008913915696f),
765 | Offset(x = 512f, y = 357.7345045722767f),
766 | Offset(x = 512f, y = 354.75333177213815f),
767 | Offset(x = 512f, y = 351.74571943294023f),
768 | Offset(x = 512f, y = 348.74885633323436f),
769 | Offset(x = 512f, y = 345.7499575587308f),
770 | Offset(x = 512f, y = 342.7350130944096f),
771 | Offset(x = 512f, y = 339.7507123714995f),
772 | Offset(x = 512f, y = 336.7500807811443f),
773 | Offset(x = 512f, y = 333.7396829328221f),
774 | Offset(x = 512f, y = 330.74430599545025f),
775 | Offset(x = 512f, y = 327.7359609406013f),
776 | Offset(x = 512f, y = 324.7523487928954f),
777 | Offset(x = 512f, y = 321.74214541095796f),
778 | Offset(x = 512f, y = 318.7445943342617f),
779 | Offset(x = 512f, y = 315.7474213306736f),
780 | Offset(x = 512f, y = 312.7378363422062f),
781 | Offset(x = 512f, y = 309.7510671070349f),
782 | Offset(x = 512f, y = 306.73552112382407f),
783 | Offset(x = 512f, y = 303.74507991231695f),
784 | Offset(x = 512f, y = 300.75099825179575f),
785 | Offset(x = 512f, y = 297.7350838162017f),
786 | Offset(x = 512f, y = 294.7466171256159f),
787 | Offset(x = 512f, y = 291.73948328236605f),
788 | Offset(x = 512f, y = 288.7433161132907f),
789 | Offset(x = 512f, y = 285.742129227298f),
790 | Offset(x = 512f, y = 282.7344028999578f),
791 | Offset(x = 512f, y = 279.7398095566758f),
792 | Offset(x = 512f, y = 276.7478501781199f),
793 | Offset(x = 512f, y = 273.74326524580607f),
794 | Offset(x = 512f, y = 270.73648686167456f),
795 | Offset(x = 512f, y = 267.7371476341481f),
796 | Offset(x = 512f, y = 264.7386803495128f),
797 | Offset(x = 512f, y = 261.74845115331993f),
798 | Offset(x = 512f, y = 258.7414004666896f),
799 | Offset(x = 512f, y = 255.73869993299962f),
800 | Offset(x = 512f, y = 252.7457165180672f),
801 | Offset(x = 512f, y = 249.73437978895686f),
802 | Offset(x = 512f, y = 246.74181541509017f),
803 | Offset(x = 512f, y = 243.73879609852395f),
804 | Offset(x = 512f, y = 240.74569329261146f),
805 | Offset(x = 512f, y = 237.74905028645992f),
806 | Offset(x = 512f, y = 234.73484547788428f),
807 | Offset(x = 512f, y = 231.74039621212074f),
808 | Offset(x = 512f, y = 228.73427353307656f),
809 | Offset(x = 512f, y = 225.73655584537846f),
810 | Offset(x = 512f, y = 222.75005659973837f),
811 | Offset(x = 512f, y = 219.74271942272702f),
812 | Offset(x = 512f, y = 216.7519610191511f),
813 | Offset(x = 512f, y = 213.7456754904891f),
814 | Offset(x = 512f, y = 210.74393446337706f),
815 | Offset(x = 512f, y = 207.74942121006112f),
816 | Offset(x = 512f, y = 204.74760099212006f),
817 | Offset(x = 512f, y = 201.7414004136876f),
818 | Offset(x = 512f, y = 198.73384202641125f),
819 | Offset(x = 512f, y = 195.74496914006863f),
820 | Offset(x = 512f, y = 192.74402152438591f),
821 | Offset(x = 512f, y = 189.73471336279994f),
822 | Offset(x = 512f, y = 186.73744127776524f),
823 | Offset(x = 512f, y = 183.7394938170977f),
824 | Offset(x = 512f, y = 180.7451688011094f),
825 | Offset(x = 512f, y = 177.74313409328363f),
826 | Offset(x = 512f, y = 174.73888722087867f),
827 | Offset(x = 512f, y = 171.73829479630055f),
828 | Offset(x = 512f, y = 168.74760587978295f),
829 | Offset(x = 512f, y = 165.74405400605139f),
830 | Offset(x = 512f, y = 162.73681064436386f),
831 | Offset(x = 512f, y = 159.73582272177367f),
832 | Offset(x = 512f, y = 156.73831553035788f),
833 | Offset(x = 512f, y = 153.7442092827994f),
834 | Offset(x = 512f, y = 150.74399958572286f),
835 | Offset(x = 512f, y = 147.7340794827547f),
836 | Offset(x = 512f, y = 144.7406860426571f),
837 | Offset(x = 512f, y = 141.7396236808449f),
838 | Offset(x = 512f, y = 138.73530228932339f),
839 | Offset(x = 512f, y = 135.75228490149973f),
840 | Offset(x = 512f, y = 132.7455871153769f),
841 | Offset(x = 512f, y = 129.73743032879378f),
842 | Offset(x = 512f, y = 126.74076604047347f),
843 | Offset(x = 512f, y = 123.73574234001339f),
844 | Offset(x = 512f, y = 120.7415529921893f),
845 | Offset(x = 512f, y = 117.74682337125203f),
846 | Offset(x = 512f, y = 114.74792125897036f),
847 | Offset(x = 512f, y = 111.74456055816562f),
848 | Offset(x = 512f, y = 108.73942153142728f),
849 | Offset(x = 512f, y = 105.75272904121665f),
850 | Offset(x = 512f, y = 102.73375581796653f),
851 | Offset(x = 512f, y = 99.74003619559012f),
852 | Offset(x = 512f, y = 96.7431771849735f),
853 | Offset(x = 512f, y = 93.73501520553044f),
854 | Offset(x = 512f, y = 90.73535944559612f),
855 | Offset(x = 512f, y = 87.74423372965796f),
856 | Offset(x = 512f, y = 84.74081190607345f),
857 | Offset(x = 512f, y = 81.73718617934136f),
858 | Offset(x = 512f, y = 78.74469235199014f),
859 | Offset(x = 512f, y = 75.73765472360051f),
860 | Offset(x = 512f, y = 72.74410476935648f),
861 | Offset(x = 512f, y = 69.7376019768262f),
862 | Offset(x = 512f, y = 66.74617943701195f),
863 | Offset(x = 512f, y = 63.74418409041849f),
864 | Offset(x = 512f, y = 60.742971363006184f),
865 | Offset(x = 512f, y = 57.73744253073659f),
866 | Offset(x = 512f, y = 54.74164327701604f),
867 | Offset(x = 512f, y = 51.738146221262866f),
868 | Offset(x = 512f, y = 48.74681927934507f),
869 | Offset(x = 512f, y = 45.74448950450787f),
870 | Offset(x = 512f, y = 42.748437360080864f),
871 | Offset(x = 512f, y = 39.74398620327431f),
872 | Offset(x = 512f, y = 36.75207150077817f),
873 | Offset(x = 512f, y = 33.742976676836605f),
874 | Offset(x = 512f, y = 30.749794780550527f),
875 | Offset(x = 512f, y = 27.739776371881366f),
876 | Offset(x = 511.9999795770759f, y = 24.742163957098732f),
877 | Offset(x = 511.8140884628296f, y = 21.744036277771f),
878 | Offset(x = 511.27070181393066f, y = 18.807503315726297f),
879 | Offset(x = 510.3687434768677f, y = 15.934035163879393f),
880 | Offset(x = 509.13727490234373f, y = 13.21453271484375f),
881 | Offset(x = 507.57338619420494f, y = 10.641950178792701f),
882 | Offset(x = 505.72665777587895f, y = 8.297861389160158f),
883 | Offset(x = 503.5913897232059f, y = 6.175221558282152f),
884 | )
885 |
--------------------------------------------------------------------------------