(1) W górnej części widoku Twojego kalkulatora arytmetycznego z poprzedniego zestawu dodaj Canvas i wygeneruj na nim osie układu współrzędnych (XY) i wykres funkcji f(x) = x^2-4, w przedziale od -3 do 3, a także tekst zawierający postać tej funkcji i informacje o obliczonej wartości delty i pierwiastków. Dobierz odpowiednio wielkość i lokalizacje wszystkich elementów, tak aby wszystkie informacje umieszczone na wyświetlaczu graficznym były czytelne. Szczegóły dotyczące użycia tego elementu znajdziesz w dokumentacji i w przykładzie poniżej.
https://developer.android.com/develop/ui/compose/graphics/draw/overview
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { Calc() } } @Composable fun Calc(){ val s: MutableState<String> = remember{mutableStateOf("0")} val op: MutableState<Char> = remember{mutableStateOf('+')} val buf: MutableIntState = remember{mutableIntStateOf(0)} Column( modifier = Modifier .fillMaxWidth() .padding(16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Spacer(modifier = Modifier.height(100.dp)) // Canvas val textMeasurer = rememberTextMeasurer() Canvas( modifier = Modifier .size(300.dp) .background(Color.LightGray) ) { // Rozmiar Canvas val canvasWidth = size.width val canvasHeight = size.height // Środek układu współrzędnych val centerX = canvasWidth / 2 val centerY = canvasHeight / 2 // Skala (jak duży ma być wykres na Canvasie) val scaleX = canvasWidth / 20 // Skala dla osi X (przedział -10 do 10) val scaleY = canvasHeight / 4 // Skala dla osi Y // Rysowanie osi X i Y drawLine( color = Color.Black, start = Offset(0f, centerY), end = Offset(canvasWidth, centerY), strokeWidth = 2f ) drawLine( color = Color.Black, start = Offset(centerX, 0f), end = Offset(centerX, canvasHeight), strokeWidth = 2f ) // Rysowanie wykresu funkcji sin(x)/x val points = mutableListOf<Offset>() for (x in -1000..1000) { // Iteracja po wartościach w przedziale od -10 do 10 (skalowane) val realX = x / 100f // Przeliczenie wartości na rzeczywisty przedział (-10 do 10) val yValue = if (realX == 0f) 1f else kotlin.math.sin(realX) / realX // Obliczenie sin(x)/x // Przeliczenie współrzędnych na Canvas (skala i przesunięcie środka) val canvasX = centerX + realX * scaleX val canvasY = centerY - yValue * scaleY points.add(Offset(canvasX, canvasY)) } // Rysowanie punktów jako wykresu funkcji drawPoints( points = points, pointMode = PointMode.Polygon, // Łączenie punktów linią color = Color.Blue, strokeWidth = 2f ) // Tekst drawText( textMeasurer = textMeasurer, text = "f(x)=sin(x)/x", topLeft = Offset(x = 430f, y = 100f), style = androidx.compose.ui.text.TextStyle( fontSize = 20.sp, color = Color.Black ) ) } Spacer(modifier = Modifier.height(60.dp)) Row{ Text( modifier = Modifier.fillMaxWidth(0.5f), text = s.value, fontSize = 20.sp ) } Spacer(modifier = Modifier.height(10.dp)) Row{ Button(onClick = { if (s.value == "0") s.value = "1" else s.value += "1" }) { Text(text = "1") } Button(onClick = {if(s.value == "0") s.value="2" else s.value+="2"}) { Text( text="2" ) } Button(onClick = {if(s.value == "0") s.value="3" else s.value+="3"}) { Text( text="3" ) } Button(onClick = {op.value='+'; buf.intValue = s.value.toInt(); s.value="0"}) { Text( text="+" ) } } Row{ Button(onClick = {if(s.value == "0") s.value="4" else s.value+="4"}) { Text( text="4" ) } Button(onClick = {}) { Text( text="" ) } Button(onClick = {}) { Text( text="" ) } Button(onClick = {op.value='-'; buf.intValue = s.value.toInt(); s.value="0"}) { Text( text="-" ) } } Row{ Button(onClick = {if(s.value == "0") s.value="7" else s.value+="7"}) { Text( text="7" ) } Button(onClick = {}) { Text( text="" ) } Button(onClick = {}) { Text( text="" ) } Button(onClick = {}) { Text( text="" ) } } Row{ Button(onClick = {s.value="0" }) { Text( text="C" ) } Button( onClick = {if(op.value=='+') buf.intValue += s.value.toInt() else buf.intValue -= s.value.toInt(); s.value = buf.intValue.toString()}, modifier = Modifier.fillMaxWidth(0.5f) ) { Text( text="=" ) } } } } }
I jeszcze kontrolnie lista potrzebnych importów
import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableIntState import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.PointMode import androidx.compose.ui.text.drawText import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp
(2) Do Twojego kalkulatora dodaj przyciski umożliwiające dodanie do wyświetlacza potrzebnych symboli (takich jak x, y, f, symbol przecinka) w ten sposób żeby możliwe było napisanie na wyświetlaczu wielomianu drugiego stopnia (postaci „f(x) = ax^2 + bx + c”) oraz przycisku „Plot”. Po naciśnięciu tego przycisku, Twój kalkulator powinien przeparsować wprowadzony wielomian i odczytać wartości współczynników a, b i c, a następnie wyznaczyć deltę i miejsca zerowe oraz narysować wykres funkcji w przedziale obejmującym wszystkie (dwa, jeden lub zero) miejsca zerowe. Informacje o obliczonych wartościach delty i pierwiastków powinny być wydrukowane obok wykresu.