我不擅长数学,我试图生成一些随机数据,但我无法想象我是如何实现这一目标的。 我想生成12个显示0到100的条形图。但是我不希望它们都是随机的,我希望它们中的一些有一个很好的曲线结果,如下所示:
public class SettingsFragment extends Fragment implements ISpinnerDatePickerDialogListener, ISpinnerTimePickerDialogListener {
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// initialize listeners for text inputs, to open picker dialogs
periodBegin = (EditText) getView().findViewById(R.id.editPeriodBegin);
periodBegin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(PERIOD_BEGIN_DIALOG_ID);
}
});
}
/**
* opens dialog for id
*
* @param id
*/
private void showDialog(int id) {
switch(id) {
case PERIOD_BEGIN_DIALOG_ID:
SpinnerDatePickerDialog datePickerDialog;
datePickerDialog = new SpinnerDatePickerDialog(this);
datePickerDialog.show(getFragmentManager(), datePickerDialog.getTAG());
break;
}
@Override
public void onSpinnerDateDialogPositiveClick(SpinnerDatePickerDialog dialog) {
// TODO send DatePicker values with listener
// load DatePicker from dialog and set them to EditText text
DatePicker datePicker = dialog.getDatePicker();
int day = datePicker.getDayOfMonth();
int month = datePicker.getMonth();
int year = datePicker.getYear();
// TODO
String formattedDate = FORMAT.format(new Date(year - 1900, month, day));
periodBegin.setText(formattedDate);
}
@Override
public void onSpinnerDateDialogNegativeClick(SpinnerDatePickerDialog dialog) {
// Nothing to do here
}
}
澄清:
-EDIT(1)
值会像图片中的曲线一样上下变化:
突破点可能发生在任何地方。
如果我问得太多,请告诉我正确的方向,我会自己解决。
提前致谢。
答案 0 :(得分:1)
我会生成随机曲线,然后用以下条形插值:
生成n
个控制点
x(i)=i;
y(i)=100.0*Random();
您不需要x(i)
...
生成m > n
条
所以只需使用n
点作为BEZIER或任何其他多项式曲线的控制点并计算你的条形...让我们假设使用单cubic n=4
的简单情况然后你的控制点将转换为多项式:
y(t) = a0 + a1*t +a2*t^2 + a3*t^3
所以计算每个条形大小如:
i={0,1,2,3,...,m-1}
t=i/(m-1); // this converts i to t=<0,1>
bar(i) = a0 + a1*t +a2*t^2 + a3*t^3
不要忘记钳制bar(i)
,使其不超过<0,100>
。这将创建像条形一样的平滑随机曲线。
如果我将所有这些放在一起,我可以在C ++中做这样的事情:
double d1,d2,y0,y1,y2,y3,a0,a1,a2,a3,t;
// n=4 random control points for cubic
y0=100.0*Random();
y1=100.0*Random();
y2=100.0*Random();
y3=100.0*Random();
// convert them to interpolation cubic
d1=0.5*(y2-y0);
d2=0.5*(y3-y1);
a0=y1;
a1=d1;
a2=(3.0*(y2-y1))-(2.0*d1)-d2;
a3=d1+d2+(2.0*(-y2+y1));
// compute m bars
const int m=10;
double bar[m]; int i;
for (i=0;i<m;i++)
{
t=double(i)/double(m-1);
bar[i] = a0 + a1*t +a2*t*t + a3*t*t*t;
if (bar[i]<0.0) bar[i]=0.0;
if (bar[i]>100.0) bar[i]=100.0;
}
代码未在此处直接编写,因此可能包含拼写错误。条形应平滑地遵循三次曲线,因此它应满足您的所有需求......您可以使用更大程度的曲线多项式和/或分段插值,以防您需要更多的凸起。有关详细信息,请参阅: