├── 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 | ![](/images/wave_circle_animation.gif) 13 | 14 | Pikachu Shape 15 | 16 | ![](/images/pikachu_shape.gif) 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 | ![](/images/run_desktop_gradle_tool.png) 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 | --------------------------------------------------------------------------------