#ios #swift #plot #core-plot #math-functions
Вопрос:
let graph = CPTXYGraph(frame: hostview.bounds)
hostview.hostedGraph = graph
graph.paddingLeft = 0.0
graph.paddingTop = 0.0
graph.paddingRight = 0.0
graph.paddingBottom = 0.0
graph.axisSet = nil
Пока что это мой код. Я хотел бы построить функцию. в этом случае значением функции должно быть f(x) = x^2 10. Я хочу, чтобы оси x и y начинались с 0 и заканчивались на 100.
Может ли кто-нибудь помочь мне с реализацией этого f(x)?
Ответ №1:
Ваша логика инициализации графика должна выглядеть следующим образом. Используйте это в viewDidLoad
func initPlot() {
let graph = CPTXYGraph(frame: hostView.bounds)
graph.plotAreaFrame?.masksToBorder = false
hostView.hostedGraph = graph
graph.backgroundColor = UIColor.white.cgColor
graph.paddingBottom = 40.0
graph.paddingLeft = 40.0
graph.paddingTop = 40.0
graph.paddingRight = 40.0
//configure title
let title = "f(x) = x*x 10"
graph.title = title
//configure axes
let axisSet = graph.axisSet as! CPTXYAxisSet
if let x = axisSet.xAxis {
x.majorIntervalLength = 20
x.minorTicksPerInterval = 1
}
if let y = axisSet.yAxis {
y.majorIntervalLength = 5
y.minorTicksPerInterval = 5
}
let xMin = 0.0
let xMax = 100.0
let yMin = 0.0
let yMax = 100.0
guard let plotSpace = graph.defaultPlotSpace as? CPTXYPlotSpace else { return }
plotSpace.xRange = CPTPlotRange(locationDecimal: CPTDecimalFromDouble(xMin), lengthDecimal: CPTDecimalFromDouble(xMax - xMin))
plotSpace.yRange = CPTPlotRange(locationDecimal: CPTDecimalFromDouble(yMin), lengthDecimal: CPTDecimalFromDouble(yMax - yMin))
//create the plot
plot = CPTScatterPlot()
plot.dataSource = self
graph.add(plot, to: graph.defaultPlotSpace)
}
Кроме того , вам необходимо реализовать CPTScatterPlotDataSource
, где вы определяете numberOfRecords
соответствующие X
Y
значения и и
extension ViewController: CPTScatterPlotDataSource {
func numberOfRecords(for plot: CPTPlot) -> UInt {
return 100
}
func number(for plot: CPTPlot, field: UInt, record: UInt) -> Any? {
switch CPTScatterPlotField(rawValue: Int(field))! {
case .X:
return record
case .Y:
return (record * record) 10
default:
return 0
}
}
}
Комментарии:
1. Есть ли хороший способ создать функцию, которая принимает два входных параметра? Он должен иметь вид f(x) = a * x^2 c, где пользователь должен иметь возможность устанавливать значения для a и c. Есть какие-нибудь идеи? Спасибо вам за ваш ответ, очень помог.
2. Рад, что этот ответ вам помог :). Вы можете определить две переменные для a и c в ViewController и использовать их внутри метода делегирования CPTScatterPlotDataSource, например, a * (запись * запись) c. Не могли бы вы, пожалуйста, озвучить ответ, если это вам помогло. Если это решило вашу проблему, пожалуйста, примите ответ.
3. Я пока не могу поднять голос. Мне нужно больше репутации.
4. Не беспокойтесь. спасибо, что согласились